WebLogic升级后Spring Boot JMS监听器重复消费消息求助
问题:WebLogic 12.2.1.4升级后Spring Boot JmsListener重复消费消息
问题场景
Spring Boot应用从WebLogic JMS队列ReqQueue消费消息,处理完成后将响应发送至RespQueue。将WebLogic版本从12.2.1.3升级至12.2.1.4后,出现JmsListener重复接收消息的问题:部分消息首次接收时已被成功处理,但仍会被重复投递,直到响应成功发送至RespQueue;若为RespQueue设置重发限制为0,会出现部分响应无法发送的情况。
配置代码
@Bean(name = "myFactory") public JmsListenerContainerFactory<?> myFactory( @Qualifier("connectionFactory") ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setErrorHandler(t -> { logger.error("Error in listener!", t); }); // factory.setMessageConverter(jacksonJmsMessageConverter()); factory.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE); factory.setSessionTransacted(true); factory.setConcurrency("5-13"); configurer.configure(factory, connectionFactory); logger.error("**** Message AUTO_ACKNOWLEDGE"); return factory; } @Autowired @Bean(name = "connectionFactory") public JndiObjectFactoryBean connectionFactory(JndiTemplate provider){ JndiObjectFactoryBean factory = new JndiObjectFactoryBean(); factory.setJndiTemplate(provider); factory.setJndiName(connectionType); factory.setProxyInterface(ConnectionFactory.class); return factory; } @JmsListener(destination = "jms/ReqQueue", containerFactory = "myFactory") public void receive(@Payload Message message, @Header(JmsHeaders.CORRELATION_ID) String correlationId, @Header(JmsHeaders.MESSAGE_ID) String messageId, @Headers Map<String, Object> headers, MessageHeaders messageHeaders, JmsMessageHeaderAccessor jmsMessageHeaderAccessor) throws JMSException, JmsHeaderValidationException, JsonParseException, JsonMappingException, IOException, InterruptedException {
环境配置说明
- WebLogic连接工厂的事务超时设置超过5小时
相关日志
警告日志
[WARN] [DefaultMessageListenerContainer-41] [org.springframework.jms.listener.DefaultMessageListenerContainer:895] Setup of JMS message listener invoker failed for destination 'jms/ReqQueue' - trying to recover. Cause: JTA transaction already rolled back (probably due to a timeout)
调试异常日志
[DefaultMessageListenerContainer-28] [org.springframework.transaction.jta.WebLogicJtaTransactionManager:743] Initiating transaction commit [DEBUG] [DefaultMessageListenerContainer-28] [org.springframework.jms.listener.DefaultMessageListenerContainer:884] Setup of JMS message listener invoker failed - already recovered by other invoker org.springframework.transaction.UnexpectedRollbackException: JTA transaction already rolled back (probably due to a timeout) at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1032) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:746) at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:714) at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:251) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1189) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1179) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1076) at java.lang.Thread.run(Thread.java:750)
内容的提问来源于stack exchange,提问作者Baskar
相关产品推荐
相关产品推荐

