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

如何接收在artemis控制台中创建的多播类型队列消息

通寂离
2023-03-14

>

  • 下载Artemis2.13.0,预先创建组播地址测试,然后在此地址上创建组播队列123,使用控制台向123队列发送1消息

    使用IDEA创建springboot项目,pom文件导入以下依赖项

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-artemis</artifactId>
            </dependency>
    
            <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
            <version>5.2.5.RELEASE</version>
            <scope>compile</scope>
        </dependency>
    
    
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>artemis-jms-client</artifactId>
            <version>2.13.0</version>
            <scope>compile</scope>
        </dependency>
    

    pplication.properties添加配置

    spring.artemis.mode=native
    spring.artemis.host=localhost
    spring.artemis.port=61616
    spring.artemis.user=test
    spring.artemis.password=123456
    
    spring.jms.pub-sub-domain=true
    

    创建消费者以接收在队列123中预先创建的消息

    import org.springframework.jms.annotation.JmsListener;
    import org.springframework.stereotype.Component;
    
    @Component
    public class Consumer{
        @JmsListener(destination="test::123")
        public void consumerMessage(String text){
            System.out.println("从queue队列收到的回复信息为:"+text);
        }
    
    }
    

    我无法接收该消息,使用2.13.0artemis-jms-client将出现以下错误消息

    Setup of JMS message listener invoker failed for destination 'test::123' - trying to recover. Cause: AMQ229019: Queue 123 already exists on address test
    

    Artemis创建一个服务器,并且不修改代理文件。

  • 共有1个答案

    麹渊
    2023-03-14

    为JMS用例预先创建多播队列是相当不正常的。通常,您只需使用地址的名称作为应用程序中JMS主题的名称,然后代理将自动在该地址上创建一个队列来表示应用程序的JMS订阅,然后应用程序将接收发送到该地址的任何消息。将JMS概念映射到核心代理实现的语义将在文档中进一步讨论。

    但是,如果您的用例迫使您预先创建多播队列,那么您可以使用完全限定的队列名称(即FQQN),它遵循

    :: 的形式来访问该队列。因此,在您的示例中,您将使用test::123,例如:

    @JmsListener(destination = "test::123")
    public void receiveQueueMsg(String msg) {
        System.out.println("收到的消息为:" + msg);
    }
    

    FQQN语法和功能将在文档中进一步讨论。

    为此,我修改了ActiveMQ Artemis附带的spring-boot-integration示例,以使用普通JMS客户机(即,不是AMQP JMS客户机),并将FQQN与多播队列一起使用,所有操作都按预期进行。

     类似资料:
    • 我准备使用C#应用程序通过ActiveMQ Artemis发送和接收消息。在选播模式下,一切都在工作。 通常我会收到消息,因为我只是从选播切换到多播,但实际上我什么也没有收到。

    • 当消费者订阅一个主题时,一个多播队列会自动创建一个系统生成的名称。我想知道是否有可能控制这个名称生成以使它更友好(像consumer_idsession_ididx)。 我使用web控制台进行监视,在以前版本的ActiveMQ(在Artemis之前)中,我可以看到每个订阅主题的用户名称,这非常方便。 我以前在ActiveMQ 5.0的web控制台中看到的内容: 我现在在使用Artemis的控制台中

    • 此问题是关于在中使用AMQP消费消息。网文档建议使用amqpnetlite:https://access.redhat.com/documentation/en-us/red_hat_amq/7.0/html-single/using_the_amq_.net_client/index 使用AMQPNetLite订阅地址时,地址和队列将自动创建。不过,自动创建的队列总是“单播”。我无法自动创建 多

    • 因为正如我在Active MQ Artemis文档中看到的,持久值是一个布尔值,但在amqpnetlite库中它是一个uint,我的理解是,超过0的所有内容都应该是true,而0应该是false。 起初,这种行为非常奇怪:即使当Aretemis Web界面显示为持久队列时,一旦没有用户连接,它也会被删除。 我发现:ActiveMQ Artemis queue在关闭消费客户机后被删除,这描述了即使是

    • 我运行生产者,它生成N条消息,我在仪表板上看到它们。当我运行接收器时,它会接收来自队列的所有消息,并且队列为空。 我需要有多个生产者生成消息到同一个队列。多个客户从队列中接收消息。消息将被队列TTL删除。但是现在第一个接收者从队列中获取所有消息。我怎么能做到这一点?