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

标签 java queue jms activemq producer-consumer

我有一个实现消息生成器的 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/

相关文章:

java - java.lang.NullPointerException,我不知道出了什么问题

SQL Server 进程队列竞争条件

queue - 通过 REST 向服务总线队列发送消息并通过 TCP 接收消息?

java - 在内存中,activemq 不会跨连接持久存在

java - 在 Thorntail 中使用 ActiveMQ 配置 JMS

java - 如何使用 NetBeans 修改/添加代码到 Java 中的 initComponents() 方法?

java - 从另一个 Maven 存储库 Artifact 中获取所有 hibernate 注释/实体

java - 使用 SWT 在 Eclipse 插件透视图中加载 BMP

python - 接收流时中断python grpc客户端

java - 当 JMS 服务器消失时 JMS 捕获