下载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.0 artemis-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
使用IDEA无需任何修改即可直接创建新的springboot项目。
Artemis创建服务器,并且不修改代理文件。
答案 0 :(得分:0)
为JMS用例预先创建一个多播队列是很不正常的。通常,您只需在应用程序中使用地址名称作为JMS主题的名称,然后代理将在地址上自动创建一个队列以表示应用程序的JMS订阅,然后应用程序将接收发送到该队列的任何消息。地址。在the documentation中进一步讨论了将JMS概念映射到核心代理实现的语义。
但是,如果您的用例强迫您要预先创建多播队列,则可以使用遵循{{}形式的标准队列名称(即FQQN)来访问该队列。 1}}。因此,在您的情况下,您可以使用<address>::<queue>
,例如:
test::123
FQQN语法和功能在the documentation中有进一步讨论。
对于它的价值,我修改了ActiveMQ Artemis附带的spring-boot-integration
示例,以使用普通的JMS客户端(即,不是AMQP JMS客户端),并使用FQQN和多播队列,并且一切正常。