当前位置: 首页 > 知识库问答 >
问题:

如何配置不再创建ActiveMQ Artemis队列

甄正信
2023-03-14
errorType=QUEUE_EXISTS message=AMQ229019: Queue hornetq already exists on address router
try {
    ActiveMQServer server = new ActiveMQServerImpl(new ConfigurationImpl()
         .setPersistenceEnabled(true)
         .setBindingsDirectory("./router/data/bindings")
         .setLargeMessagesDirectory("./router/data/large")
         .setPagingDirectory("./router/data/paging")
         .setJournalDirectory("./router/data/journal")
         .setSecurityEnabled(false)
         .addAcceptorConfiguration("tcp", "tcp://0.0.0.0:61617?protocols=CORE,AMQP"));
    server.start();
} catch (Exception ex) {
    System.err.println(ex);
}
ServerLocator serverLocator = ActiveMQClient.createServerLocator("tcp://127.0.0.1.3:61617");
ClientSessionFactory factory = serverLocator.createSessionFactory();
ClientSession session = factory.createSession();
session.createQueue(new QueueConfiguration("router::hornetq")
        .setAutoCreateAddress(Boolean.FALSE)
        .setAutoCreated(Boolean.FALSE)
        .setRoutingType(RoutingType.ANYCAST));
ClientProducer producer = session.createProducer("router::hornetq");
ClientMessage message = session.createMessage(true);
message.getBodyBuffer().writeString("Core Queue Message");
producer.send(message);
session.start();
ClientConsumer consumer = session.createConsumer("router::hornetq");
ClientMessage msgReceived = consumer.receive();
System.out.println("message = " + msgReceived.getBodyBuffer().readString());
session.close();

共有1个答案

华景焕
2023-03-14

您的客户机正在使用核心API,这是一个不支持自动创建队列的低级API。您的客户端正在手动创建(或试图创建)队列,例如:

session.createQueue(new QueueConfiguration("router::hornetq")
        .setAutoCreateAddress(Boolean.FALSE)
        .setAutoCreated(Boolean.FALSE)
        .setRoutingType(RoutingType.ANYCAST));

如果队列已经存在,您看到的异常无疑是在这里抛出的。创建队列不是幂等的,所以我可以看到以下三个选项:

  • 只需捕捉此处抛出的ActiveMQQueueExistsException并忽略它。
  • 在尝试创建队列之前,使用clientsession.queuequery查看该队列是否存在。如果它存在,那么不要试图再次创建它。如果它不存在,那么创建它。也就是说,如果您有许多像这样的客户端同时运行,由于客户端之间的竞争条件,您仍然有可能获得ActiveMQQueueExistsException
  • 使用支持自动创建的客户机/协议,如核心JMS客户机或AMQP。
    null
 类似资料:
  • 问题内容: 这听起来像是一个非常笼统的问题,但这是正确的。 我有一个要求,以创建我的应用程序配置脚本,将生成的这种配置的结果(基本,,)。我的问题是,我应该从哪里开始构建?有没有我可以效仿的例子? 问题答案: 要创建标准的“配置”脚本,您需要GNU autoconf。您可能还需要GNU automake和libtool。 有大量的文档和指导。谷歌搜索“ autoconf automake howt

  • 我们目前正在使用nservicebus从azure servicebus队列读取消息。 我可以通过代码创建所需的队列,但有人知道我是否可以设置配置文件,在azure上自动创建错误和输入队列吗?

  • 问题内容: 问题: 更新: 从Java SE 6 API: public JComboBox() 创建带有默认数据模型的JComboBox。默认数据模型是对象的空列表。使用addItem添加项目。 默认情况下,数据模型中的第一项变为选中状态。 因此,我将API更改为JComboBox(model): public JComboBox(ComboBoxModel aModel) 创建一个JCombo

  • elasticsearch版本:elasticsearch-2.2.0。rpm logstash版本:logstash-2.2.2-1。诺奇。转速 我启动elasticsearch,然后使用具有基本标准输入/标准输出的 /etc/logstash/conf.d/logstash.conf进行logstash,但没有创建elasticsearch索引。如果我将以下内容添加到我的logstash输出配

  • 问题内容: 我正在尝试使用Spring Reactor 3组件和Spring Integration从JMS队列创建反应式流(Flux)。 我正在尝试从JMS队列(使用Spring Integration的ActiveMQ)创建客户端的响应流(Spring Reactor 3 Flux),以使客户端异步获取JMS消息。我相信我已经正确连接了所有东西,但是在服务器停止之前,客户端不会收到任何JMS消