我正在使用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 behavior是reject-publish
,确认 channel 将得到nack
。它也包含在许多 AMQP 客户端中。
但是在JMS客户端中,我检查了rabbitmq-jms-client中的代码,并且没有发送实现包含 CompletionListener
。因此,如果您想享受可靠的发布,请使用AMQP客户端。
关于java - 当消息因队列大小而被拒绝时,RabbitMQ 不会导致发送失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56657369/