java - 当消息因队列大小而被拒绝时,RabbitMQ 不会导致发送失败

标签 java rabbitmq jms

我正在使用RMQ,它是JMS客户端将消息发布到RMQ(这是我的要求,我不能使用他们的java客户端而不是JMS客户端)。

所以,基本上我这样做:

        RMQConnectionFactory factory = new RMQConnectionFactory() ;
        factory.setUsername(props.getProperty("rmq.username"));
        factory.setPassword(props.getProperty("rmq.password"));
        factory.setHost(props.getProperty("rmq.host"));
        factory.setVirtualHost(props.getProperty("rmq.virtualHost"));
        factory.setPort(Integer.parseInt(props.getProperty("rmq.port")));

        Connection connection = factory.createConnection();
        connection.start();
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        String queueName = managerProps.getProperty("rmq.queue.name");
        Queue queue = session.createQueue(queueName);
        producer = session.createProducer(queue);

        TextMessage msg = session.createTextMessage(text);
        msg.setText(text);
        producer.send(msg);

我对 RMQ 溢出设置了一个策略:拒绝发布,因此如果超出限制,RMQ 应该在队列已满时发送 nack,但我似乎不明白。

问题是 - 如何确定邮件是否被拒绝?我假设 Producer.send(msg) 是同步的,如果消息未发布,则会抛出异常,但我没有收到任何异常,它看起来就像所有内容都已发布。

JMS 规范有一个带有监听器的 send(msg, CompletionListener),该监听器具有 onCompletion 和 onException 两个方法,但看起来 RMQ JMS 客户端并未实现此方法。

还有其他方法可以确保该消息成功发送吗?

最佳答案

RabbitMQ 使用 Publisher Confirms以保证消息不会丢失,所以如果您的 Queue overflow behaviorreject-publish,确认 channel 将得到nack。它也包含在许多 AMQP 客户端中。

但是在JMS客户端中,我检查了rabbitmq-jms-client中的代码,并且没有发送实现包含 CompletionListener。因此,如果您想享受可靠的发布,请使用AMQP客户端。

关于java - 当消息因队列大小而被拒绝时,RabbitMQ 不会导致发送失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56657369/

相关文章:

java - 如何右对齐 SWT 表格单元格中的文本?

java - 为什么当通过其他方法更改数组时,数组的打印结果会有所不同?

java - 如何使用Spring AMQP读取队列中的消息?

java - 消息仅发布到 RabbitMQ Fanout 交换中的一个队列 (java)

java - Spring JmsTemplate 是否默认关闭连接?

java - AMQP - Rabbit MQ 用法

java - 无法将动态创建的复选框添加到 jPanel

java - 安装插件后动态执行不起作用

redis - 在 Kubernetes 上运行 Kafka 是一种好方法吗?

tomcat - struts 中的 JMS 队列连接工厂