【问题标题】:In memory activemq not persisting across connections在内存中,activemq 不会跨连接持续存在
【发布时间】:2019-08-08 02:59:18
【问题描述】:

我需要帮助来了解有关 ActiveMQ 的一些知识。

    connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");

场景 #1 - 我创建一个连接,关闭它,打开一个新连接,然后尝试从队列中检索消息。此结果未找到消息。

        Connection connection = connectionFactory.createConnection();
    connection.start();
    Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
    Queue queue = session.createQueue(CRIMS_REQUEST_QUEUE);

    MessageProducer producer = session.createProducer(queue);
    producer.send(session.createTextMessage(message));
    session.commit();

    connection.stop();
    connection.close();



    Connection connection2 = connectionFactory.createConnection();
    connection2.start();
    Session session2 = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
    Queue queue2 = session2.createQueue(CRIMS_REQUEST_QUEUE);
    MessageConsumer consumer2 = session2.createConsumer(queue2);
    TextMessage msg2 = (TextMessage)consumer2.receive(1000);
    System.out.println("The msg");
    System.out.println(msg2.getText());
    connection.close();

场景 #2 - 我使用相同的连接来创建一个新会话,它工作得很好

        Connection connection = connectionFactory.createConnection();
        connection.start();
        Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
        Queue queue = session.createQueue(CRIMS_REQUEST_QUEUE);

        MessageProducer producer = session.createProducer(queue);
        producer.send(session.createTextMessage(message));
        session.commit();

//      connection.stop();
//      connection.close();



//      Connection connection2 = connectionFactory.createConnection();
//      connection2.start();
        Session session2 = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
        Queue queue2 = session2.createQueue(CRIMS_REQUEST_QUEUE);
        MessageConsumer consumer2 = session2.createConsumer(queue2);
        TextMessage msg2 = (TextMessage)consumer2.receive(1000);
        System.out.println("The msg");
        System.out.println(msg2.getText());
        connection.close();

发生的事情是,我让这段代码设置了一个测试用例(因此是内存队列),我希望能够在测试中的队列中暂存一条消息,然后在真实代码中访问(通过从一个到另一个的连接工厂)。我应该改为传递连接吗?

【问题讨论】:

    标签: java jms activemq


    【解决方案1】:

    您正在看到预期的行为。您正在使用的 URL(即vm://localhost?broker.persistent=false)实际上在建立第一个连接时创建并启动一个嵌入式代理(请注意,您已禁用持久性)。一旦该连接关闭,代理也会消失。

    因此,您应该通过连接而不是连接工厂。或者您可以独立管理代理实例。

    在ActiveMQ documentation 中了解更多信息(向下滚动到“使用 ActiveMQConnectionFactory”部分)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-29
      • 2019-07-03
      • 2016-08-06
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多