java - 我向 activemq 代理发送一条预定消息,但 Web 控制台中显示两条消息

标签 java jms activemq message-queue

我编写了一个简单的ActiveMQ客户端程序来生成消息,如下所示:

public static void main(String[] args) throws Throwable
{
    final ActiveMQConnectionFactory conFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
    final QueueConnection connection = conFactory.createQueueConnection();
    final Session session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
    final Destination destination = new ActiveMQQueue("MJ_SAF");
    final MessageProducer producer = session.createProducer(destination);

    Message message = session.createTextMessage("test");
    message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 20);
    message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, 1);
    message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, 1);
    producer.send(message);
}

当这个程序执行时,我期望一条消息存储在 ActiveMQ 的计划部分中,并在 20 秒后发送到 MJ_SAF 队列,但是当我连接到 Web 控制台时看到以下结果:

enter image description here

MJ_SAF 存储了两条消息,它不正确,但当我正常发送消息(没有安排)时,我在 Web 控制台中看到一条消息。

public static void main(String[] args) throws Throwable
{
    final ActiveMQConnectionFactory conFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
    final QueueConnection connection = conFactory.createQueueConnection();
    final Session session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
    final Destination destination = new ActiveMQQueue("MJ_SAF");
    final MessageProducer producer = session.createProducer(destination);

    Message message = session.createTextMessage("test");
    producer.send(message);
}

通过上面的代码,一切都很好:

enter image description here

我不明白这种行为。有谁知道这是什么原因吗?

最佳答案

您将属性 ScheduledMessage.AMQ_SCHEDULED_REPEAT 设置为 1,因此它将重复 1 次,总共为您提供 2 条消息。

参见here用于属性的描述。据我了解,您当前的设置将等待 20 毫秒,发布 1 条消息,等待 1 毫秒,然后发布第二条消息,然后结束。

关于java - 我向 activemq 代理发送一条预定消息,但 Web 控制台中显示两条消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14934580/

相关文章:

java - 为什么JNDI资源在Tomcat中只能被调用一次?

java - 为什么一直显示 "cannot reference name before supertype constructor has been called"

java - 测量 java 中的上下文切换

java - 将包含逗号分隔的 JSONObject 的字符串转换为 JSONArray

jboss - 配置 JBoss JNDI 以绑定(bind)到不同服务器上的 JNDI?

java - 如何获取 jms 消息源的 jndi 名称

jakarta-ee - ActiveMQ 独立服务器部署或嵌入 Spring Webapp

java - 在 Redhat MRG/Apache QPID 中创建仅浏览队列

jms - 配置 JMS (ActiveMQ) 队列,使其仅包含最后一条消息

Spring,JMS - 无法为 XML 架构命名空间找到 Spring NamespaceHandler