You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 19:50:25