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

Spring JMS和ActiveMQ在哪里可以看到死信队列中的消息

钱欣然
2023-03-14

这是我的配置:

@Bean
ActiveMQConnectionFactory activeMQConnectionFactory() {
    String url = this.environment.getProperty("jms.broker.url");
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
    connectionFactory.setBrokerURL(url);
    connectionFactory.setRedeliveryPolicy(redeliveryPolicy());
    return connectionFactory;
}

@Bean
public RedeliveryPolicy redeliveryPolicy() {
    RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
    redeliveryPolicy.setInitialRedeliveryDelay(500);
    redeliveryPolicy.setBackOffMultiplier(2);
    redeliveryPolicy.setUseExponentialBackOff(true);
    redeliveryPolicy.setMaximumRedeliveries(5);
    return redeliveryPolicy;
}
.....

这是我的消费者:

@Service("msgConsumer")
public class MessageConsumer {

    private static final String ORDER_RESPONSE_QUEUE = "thequeue.Q";

    @JmsListener(destination = ORDER_RESPONSE_QUEUE, containerFactory = "jmsListenerContainerFactory")
    public void receiveMessage(final Message<String> message) throws Exception {

        MessageHeaders headers =  message.getHeaders();
        LOG.info("Application : headers received : {}", headers);

        String response = message.getPayload();
        LOG.info("Application : response received : {}",response);

        if(response.equals("launch"))
            throw new Exception("Error");
    }
}

因此,我将一条消息放入队列,其中有效负载=“launch”。

我想测试事务,如果有效负载等于“launch”,它就会抛出一个异常。

因此,多亏了重新交付政策,消费者尝试使用该消息5次。在ActiveMq队列列表中的第五个之后,我没有看到我发送的消息。

消息放在哪里?在死信队列中?在哪里可以看到带有“launch”消息的死信队列?

谢谢

共有1个答案

禄仲渊
2023-03-14

ActiveMQ。DLQ-请参阅此处的文档。

一旦消息的重新传递尝试超过为重新传递策略配置的maximumRedeliveries,就会向代理发送一个“中毒确认”,让他知道消息被视为毒丸。然后,代理接收消息并将其发送到死信队列,以便稍后对其进行分析。

ActiveMQ中的默认死信队列称为ActiveMQ。DLQ;所有无法交付的消息都将发送到此队列,这可能很难管理。因此,您可以在activemq的目标策略映射中设置individualDeadLetterStrategy。xml配置文件,允许您为给定队列或主题指定特定的死信队列前缀。如果愿意,可以使用通配符应用此策略,以便所有队列都有自己的死信队列,如下例所示。

您可以在控制台中看到DLQ;您可以像其他队列一样从中消费。

 类似资料:
  • 我正在使用死信频道EIP与骆驼文件中描述的死信频道完全相同。这是我的camel.xml(删除头) 我只有一条路由具有基于内容的路由器,其实质是,如果消息体具有getInfo,则从jms:foo路由到jms:getInfo,如果消息体具有performAction,则从jms.foo路由到jms:performAction 我预计,当jms:getInfo使用者没有运行时,交付将失败,重新交付尝试将

  • 对于Windows Vista和Windows 7,请运行: keytool-list-v-keystore“C:\users\your_user_name.androiddebugkey-storepass android-keypass android” 但是我不明白我应该在Windows中的哪里运行这个试验?

  • 我已经使用选项在Apache ActiveMQ Artemis中创建了地址和队列。但是,当我检查我的时,我没有找到我使用创建的任何地址和队列,尽管当我启动broker时,我可以在Artemis控制台上看到所有这些地址和队列。现在,我想将相同的配置复制到另一个服务器上,因为有大量的队列,所以很难在另一个服务器上创建所有的队列。是否有任何选项可以转储到并且我可以在另一台服务器上使用它,或者任何其他选项

  • 我知道他们读了很多很多书,他们一直在说同样的话。根节点没有任何父节点,只有子节点。 如果我只有舞台和场景,但没有节点,默认情况下我还会有根节点吗

  • 我已经设置了Apache camel,在其中我使用来自一个队列的消息并对其进行某种操作,然后将其传输到其他队列。 现在,如果异常来了,我希望它应该回滚,然后在6次尝试后,它发送到死信队列,目前回滚发生5-6次,但我的消息没有转移到死信队列。 这里会发生什么-->Queue1->>(消耗)-->Operation(引发异常)-->Rollback-->Queue1->>(消耗)-->Operatio

  • 在从动态队列(ActiveMQ)(挂起的消息=1000)读取消息时,我已经确认了每条消息,现在退出队列的消息数=1000。 有没有办法将所有出列的消息再次放入队列中。任何物理备份所有消息的解决方案。 提前感谢