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

JMS QUEUE:如何在队列中存储消息,直到标志设置为true

步胜
2023-03-14

我正在尝试JMS队列的一个示例应用程序。。我希望队列中的消息保持在那里,直到我的标志设置为true。我使用的是spring框架和MDP侦听器,配置如下:

服务器上下文。xml:

<bean id="MDPListener" class="controller.MDPListener"></bean>

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL">
        <value>tcp://localhost:61616</value>
        </property>
</bean>

<bean id="dataQueue" class="org.apache.activemq.command.ActiveMQQueue">
    <constructor-arg value="dataQueue15"></constructor-arg>

</bean>

<bean id="container" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="messageListener" ref="MDPListener"/>
        <property name="destination" ref="dataQueue"/>
        <property name="sessionTransacted" value="true"/>



</bean>

我的onMessage有以下代码:

public void onMessage(Message message,Session session) {        

        System.out.println("The session: "+session.toString());
        System.out.println("New Message arrived part2 .. Passing to Controller");

        Boolean g=false;

        if(g==true)
        {
            System.out.println("Data true..session committed!!");
        }
        else
        {

            System.out.println("in the queue");
            throw new RuntimeException("Saved");
        }
}

现在,当抛出异常时,消息会保留在队列中,并且控件会返回到再次收听相同消息并在一段时间后停止的同一侦听器。这会导致死队列。我无法存储该消息。我希望我的侦听器收听队列,但不是上一条消息,而是下一条。请帮忙!

共有1个答案

曹超
2023-03-14

JMS不是这样工作的——您必须将消息移动到代码中的另一个队列。

或者,使用ActiveMQ,您可以配置重新传递策略,以更快地将消息发送到DLQ(我认为默认值为6次重试)。

 类似资料:
  • 我正在使用WSO2ESB4.7.0和ActiveMQ5.8.0。我希望将消息存储在队列中,为此我尝试使用这段代码,但它不工作。我创建了存储库,这将有助于存储消息,我的conumeing过程已经在JAVA代码中完成,所以我不必担心消费,如果我这样做了,我的消息将出现在acivemq UI中。我的配置如下所示 我试图通过代理传递消息,为此我编写了简单的代理服务 在这种情况下,我的队列没有在Active

  • 我第一次使用Spring集成 脚本: 从源JMS队列读取消息,然后推送到目标JMS队列使用的通道。如果目标Jndi名称错误,重试机制就会启动。 重试耗尽后,消息推送到异常JMS队列中。 所有队列都在我本地的Weblogic 12c中。该应用程序是Spring Boot 2.1.10。释放Spring集成5.1.9。释放 当目标JMS队列的Jndi正确时,则消息发送成功。这正在工作,我可以看到消息,

  • 为什么已经拥有了共享内存时需要消息队列呢? 这将是多种原因,让我们将其分解为多个点来简化 - 据了解,一旦消息被一个进程接收到,它将不再可用于任何其他进程。 而在共享内存中,数据可供多个进程访问。 如果想使用小信息格式进行通信。 当多个进程同时进行通信时,共享内存数据需要同步保护。 使用共享内存的写入和读取频率很高,那么实现功能将会非常复杂。 在这种情况下不值得使用。 如果所有的进程不需要访问共享

  • 一、消息模型 点对点 发布/订阅 二、使用场景 异步处理 流量削锋 应用解耦 三、可靠性 发送端的可靠性 接收端的可靠性 参考资料 一、消息模型 点对点 消息生产者向消息队列中发送了一个消息之后,只能被一个消费者消费一次。 发布/订阅 消息生产者向频道发送一个消息之后,多个消费者可以从该频道订阅到这条消息并消费。 发布与订阅模式和观察者模式有以下不同: 观察者模式中,观察者和主题都知道对方的存在;

  • 一个线程会从消息队列中收取消息,另一个线程会定时给消息队列发送普通消息和紧急消息 一个线程会从消息队列中收取消息,另一个线程会定时给消息队列发送普通消息和紧急消息 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: *

  • 消息队列接口 结构体 struct   rt_messagequeue   消息队列控制块 更多...   类型定义 typedef struct rt_messagequeue *  rt_mq_t   消息队列类型指针定义   函数 rt_err_t  rt_mq_init (rt_mq_t mq, const char *name, void *msgpool, rt_size_t msg_