gpt4 book ai didi

java - 客户端确认收到生产者消息

转载 作者:行者123 更新时间:2023-12-02 07:13:07 25 4
gpt4 key购买 nike

我有一个实现消息生成器的 Java 类,它将消息发送到名为 test 的队列。我有另一个类作为客户端,它从同一个队列获取消息。我对如何知道客户端是否已收到消息感到困惑。我在某处读到我应该使用 message.acknowledge(),但我不知道执行此操作的正确方法。我的代码如下所示:

制作人:

public class Producer {
private static String url = ActiveMQConnection.DEFAULT_BROKER_URL;

private static String subject = "que";

public static void main(String[] args) throws JMSException,
InterruptedException {

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
Connection connection = connectionFactory.createConnection();
connection.start();

Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);

Destination destination = session.createQueue(subject);

MessageProducer producer = session.createProducer(destination);

//
int i = 0;
//while(true)
// {
TextMessage message = session
.createTextMessage("this is a gfjfjf " + i);
Thread.sleep(2000);
//
producer.send(message);
i++;
System.out.println("Sent message '" + message.getText() + "'");
System.out.println(ActiveMQConnection.DEFAULT_BROKER_URL);
MessageListener ML = session.getMessageListener();
System.out.println(ML);
connection.close();
}
}

消费者:

public class Consumer {

private static String url = "failover://tcp://192.168.1.17:61616";

private static String subject = "que";

public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
Connection connection = connectionFactory.createConnection();
connection.start();

Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);

Destination destination = session.createQueue(subject);

MessageConsumer consumer = session.createConsumer(destination);

// while(true)
// {
Message message = consumer.receive();

System.out.println(message);

if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
System.out.println("Received message '" + textMessage.getText()
+ "'");
}
if (session.getAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE) {
System.out.println(session.getAcknowledgeMode());
System.out.println(Session.CLIENT_ACKNOWLEDGE);
message.acknowledge();
}
System.out.println(session.getAcknowledgeMode());
System.out.println(Session.CLIENT_ACKNOWLEDGE);
message.acknowledge();

}
}

感谢任何帮助。

最佳答案

您不能使用确认来检查消息是否已收到。

实际上,一般消息传递(特别是 JMS)的设计是为了使发送应用程序不需要知道消息是否已到达客户端。这个概念被称为保证交付。

致谢是其中的一部分。如果您读取队列的消息但未确认它,JMS 代理将稍后尝试重新传送该消息。您可以使用可以提交或回滚的事务将这一概念提升到另一个层次。

如果您确实需要邮件原始发件人的回执,我建议您发送一条回复邮件。 JMS 具有使用相关 ID 和 ReplyTo 字段的请求/回复的原理图。你可以用谷歌搜索很多例子,但是here is one at EIP .

关于java - 客户端确认收到生产者消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15263841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com