首页 文章

使用ArtemisMQ Spring JMSTemplate UncategorizedJmsException

提问于
浏览
0

它很久以前正常工作 . 当我尝试循环10000个项目并逐个发送到jms队列时,就会发生此错误 .

尝试将消息发送到我的JMS队列时收到以下错误:

org.springframework.jms.UncategorizedJmsException:在JMS处理期间发生了未分类的异常;嵌套异常是org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:316)中的javax.jms.JMSException:java.lang.InterruptedException . 169)在com.shop.my.utility.exception的org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:570)的org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:487) .globalExceptionHandler.handleMyException(GlobalExceptionHandler.java:82)位于com.shop.my.myengine.scheduler.GlobalTimeoutScheduler.lambda $ 11(GlobalTimeoutScheduler.java:182)at java.util.ArrayList.forEach(ArrayList.java:1255)at com com.shop.my.my.my.my.my.my.my.my.ine.my java.util.H中的.GlobalTimeoutScheduler.lambda $ 5(GlobalTimeoutScheduler.java:103) ashMap.forEach(HashMap.java:1289)at com.shop.my.myengine.scheduler.GlobalTimeoutScheduler.processGlobalTimeout(GlobalTimeoutScheduler.java:100)at com.shop.my.myengine.scheduler.GlobalTimeoutScheduler.lambda $ 0(GlobalTimeoutScheduler.java) :70)at java.util.HashMap.forEach(HashMap.java:1289)at com.shop.my.myengine.scheduler.GlobalTimeoutScheduler.scheduleProcessGlobalTimeout(GlobalTimeoutScheduler.java:69)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) )在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)atg的java.lang.reflect.Method.invoke(Method.java:498) .springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)at java.util.concurrent.Executors $ RunnableAdapter.call(Executors .java:511)在java.u til.concurrent.FutureTask.runAndReset(FutureTask.java:308)at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 301(ScheduledThreadPoolExecutor.java:180)at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java) :294)java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread . java:748)由org.apache.activeMq.artemis上的org.apache.activemq.artemis.jms.client.ActiveMQMessageProducer.doSendx(ActiveMQMessageProducer.java:494)中的javax.jms.JMSException:java.lang.InterruptedException引起 . jms.client.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:198)位于sun.reflect的sun.reflect.GeneratedMethodAccessor167.invoke(未知来源)的org.springframework.jms.connection.CachedMessageProducer.send(CachedMessageProducer.java:181) . DelegatingMethodAccessorImpl.invoke(Delegat在com.un.proxy的org.springframework.jms.connection.CachedMessageProducer $ Jms2MessageProducerInvocationHandler.invoke(CachedMessageProducer.java:293)的java.lang.reflect.Method.invoke(Method.java:498)中的ingMethodAccessorImpl.java:43) . 在org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:626)的org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:597)org的$ Proxy346.send(未知来源) . springframework.jms.core.JmsTemplate $ 4.doInJms(JmsTemplate.java:574)at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:484)... 25更多引起:org.apache.activemq . artemis.api.core.ActiveMQInterruptedException:org.apache.activeMq.artemis.core上的org.apache.activemq.artemis.core.protocol.core.impl.ChannelImpl.sendBlocking(ChannelImpl.java:380)中的java.lang.InterruptedException .protocol.core.impl.ChannelImpl.sendBlocking(ChannelImpl.java:318)at org.apache.activemq.artemis.core.protocol.core.impl.ActiveMQSessionContext.sendFullMessage(ActiveMQSessionCon) text.java:418)atorg.apache.activemq.artemis.core.client.impl.ClientProducerImpl.sendRegularMessage(ClientProducerImpl.java:287)位于org.apache.activemq.artemis.core.client.impl.ClientProducerImpl.doSend(ClientProducerImpl.java:263)at at org.apache.activemq.artemis.core.client.impl.ClientProducerImpl.send(ClientProducerImpl.java:126)org.apache.activemq.artemis.jms.client.ActiveMQMessageProducer.doSendx(ActiveMQMessageProducer.java:491)... 36更多引起:java.util.concurrent.locks.AbstractQueuedSynchronizer中的java.lang.InterruptedException $ ConditionObject.reportInterruptAfterWait(AbstractQueuedSynchronizer.java:2014)at java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject.await(AbstractQueuedSynchronizer.java: 2173)at org.apache.activemq.artemis.core.protocol.core.impl.ChannelImpl.sendBlocking(ChannelImpl.java:378)... 42更多

我的JMSConfig:

@Configuration
public class JMSConfig {
  @Value("${spring.artemis.host}")
  private String artemisHost;
  @Value("${spring.artemis.port}")
  private String artemisPort;
  @Value("${spring.artemis.user}")
  private String artemisUser;
  @Value("${spring.artemis.password}")
  private String artemisPass;
  @Bean
  @Primary
  public CachingConnectionFactory cachingConnectionFactory() {
    StringBuilder artemisURL = new StringBuilder();
    artemisURL.append("tcp://").append(artemisHost).append(":").append(artemisPort).append("?jms.useAsyncSend=true");
    ActiveMQConnectionFactory artemiConnFactory = new ActiveMQConnectionFactory(artemisURL.toString());
    artemiConnFactory.setUser(artemisUser);
    artemiConnFactory.setPassword(artemisPass);
    artemiConnFactory.setConsumerWindowSize(0);
    CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory(artemiConnFactory);
    cachingConnectionFactory.setSessionCacheSize(20);
    return cachingConnectionFactory;
  }
  @Bean
  @Primary
  public JmsTemplate jmsTemplate(@Qualifier("cachingConnectionFactory") CachingConnectionFactory connectionFactory) {
    JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
    return jmsTemplate;
  }
}

我的类处理程序帮助将消息发送到队列:

@Aspect
@Component
public class MyGlobalExceptionHandler {

  @Autowired
  private JmsTemplate jmsTemplate;
  @Value("${environment}.${errlog.log.queue}")
  private String errorLogQueue;
  @Value("${spring.application.name}")
  private String applicationName;

  @AfterThrowing(
      pointcut = "within(com.my.service..*..*) && (@annotation(org.springframework.web.bind.annotation.RequestMapping) || @annotation(org.springframework.jms.annotation.JmsListener))",
      throwing = "myException")
  public Response<Void> handleException(MyException myException) {
    ErrLogRequest logRequest = LoggerBuilder.build(myException, applicationName);
    jmsTemplate.send(errorLogQueue, session -> session.createTextMessage(logRequest.toString()));
    return Response.<Void>builder().status(myException.errorCode).build();
  }
}

1 回答

  • 0

    引起:java.lang.InterruptedException at

    应用程序中的某些内容在发送时中断了您的线程 .

相关问题