当前位置: 首页 > 知识库问答 >
问题:

在JMS中重新传递消息

邵弘伟
2023-03-14

我正在读一条来自Solace的信息。我能够成功地阅读信息。假设我正在阅读一条消息,在侦听器线程上读取/处理消息时,应用程序崩溃。那我怎么能在那上面再读一遍那条信息呢。使用下面的代码,我无法再次阅读该消息。下面是我的配置

@JmsListener(destination = "myqueue", containerFactory = "jmsContainer", concurrency = "5-10")
    public void onMessage(Message msg) {
        
            String message;
            if (msg instanceof TextMessage) {
                message = ((TextMessage) msg).getText();
                LOG.info("In here START " +  message) ;
                Thread.sleep(60000); //I crash my app while thread is sleeping here
                LOG.info("In here END " +  msg.getJMSDestination() ) ;
                
            }
            

public class SolaceConfig {

    

    @Bean("solaceJndiTemplate")
    public JndiTemplate solaceJndiTemplate() {
        JndiTemplate solaceJndiTemplate = new JndiTemplate();
    
           // setting user name /password ommitted for brevity

            solaceJndiTemplate.setEnvironment(properties);
            
        
        return solaceJndiTemplate;
    }
    
    
    @Bean
    public JndiObjectFactoryBean solaceConnectionFactory(){
        
        JndiObjectFactoryBean solaceConnectionFactory = new JndiObjectFactoryBean();
        solaceConnectionFactory.setJndiTemplate(solaceJndiTemplate());
        solaceConnectionFactory.setJndiName(getJndiName());
        return solaceConnectionFactory;
    }
    


    @Primary
    @Bean
    public CachingConnectionFactory solaceCachedConnectionFactory(){
        CachingConnectionFactory solaceCachedConnectionFactory = new CachingConnectionFactory();
        solaceCachedConnectionFactory.setTargetConnectionFactory((ConnectionFactory)solaceConnectionFactory().getObject());
        solaceCachedConnectionFactory.setSessionCacheSize(10);
        return solaceCachedConnectionFactory;
    }


    @Bean
    public JmsTemplate jmsTemplate() {
        JmsTemplate jmsTemplate = new JmsTemplate(solaceCachedConnectionFactory());
        jmsTemplate.setDeliveryPersistent(true);
        jmsTemplate.setExplicitQosEnabled(true);
        return jmsTemplate;
    }
    

    @Bean
    public DefaultJmsListenerContainerFactory jmsContainer() {
        DefaultJmsListenerContainerFactory container = new DefaultJmsListenerContainerFactory();
        container.setConnectionFactory(solaceCachedConnectionFactory());
    //container.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE);
        return container;
    }

共有1个答案

梁鸿风
2023-03-14

使用DMLC时,应启用事务(设置sessionTransactited),以便回滚确认。

否则,请改用SimpleMessageListenerContainer

参见javadocshttps://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jms/listener/DefaultMessageListenerContainer.html

强烈建议将“会话事务”设置为“true”或指定外部“事务管理器”。有关确认模式和本机事务选项的详细信息,请参阅AbstractMessageListenerContainer javadoc,有关配置外部事务管理器的详细信息,请参阅AbstractPollingMessageListenerContainer javadoc。请注意,对于默认的“AUTO_ACKNOWLEDGE”模式,此容器在侦听器执行之前应用自动消息确认,在异常情况下不重新传递。

 类似资料:
  • 我们有一个camel路由,在这里我们从输入队列读取消息,处理它,设置一些JMS头(使用exchange.getin().setheader(...)),然后将消息路由到某个输出队列。在MQ故障转移方案期间,将重新传递消息。但是,当重新传递消息时,我前面放置的JMS头丢失了。是否有任何方法可以在重新交付后保留JMS头?

  • 我读到:http://www.javaworld.com/article/2074123/java-web-development/transaction-and-redelivery-in-jms.html?page=2 "通常,确认特定消息会确认会话接收的所有先前消息"(在客户端确认模式下) “邮件重新传递不是自动的,但在某些情况下会重新传递邮件” 我的问题是: 如何确保每次收到消息时都有一个

  • 我正在使用WerbLogic 10.3.5和Spring 3.0实现JMS队列。我有以下Spring配置: 我的消息创建代码如下所示: 我的听众是这样的: 消息被正确创建,侦听器的onMessage()方法被调用,但是如果逻辑失败,我抛出RuntimeException(),消息不会被重新传递。我尝试了上述代码的许多细微变化(例如设置SessionAcknowledgeMemodeName=SES

  • 当BOTHRESH=0时,MQ JMS类是否可以重新传递消息? 使用上述设置,是否可以使用重新传递计数通过应用程序代码管理邮件传递重试?

  • 问题内容: 我阅读了今年的UberConf的幻灯片,其中一位发言者认为Spring JMS给您的消息队列系统增加了性能开销,但是在幻灯片中我看不到任何证据支持这一点。演讲者还提出了点对点比传统“发布- 订阅”方法更快的情况,因为每个消息仅发送一次,而不是广播给每个消费者。 我想知道是否有经验的Java消息传递专家可以在这里介绍一些技术问题: 使用Spring JMS而不是单纯的JMS实际上会产生性

  • 此应用程序收到 但是,当不存在web套接字会话,并且JMSProducer将消息发送到QueueSenderSessionBean中的目标“jms/notificationQueue”时,消息会立即在NotificationEndpoint中使用。这不是我的意图。 我的目的是让队列保留消息,直到用户连接到NotificationEndpoint。如果用户没有连接到NotificationEndpo