我按照本教程让我的主应用程序作为侦听消息的服务器运行,并让支持应用程序/客户端使用 ActiveMQ 远程服务器发送消息。
定义队列时,我在客户端遇到问题,如下所示:
@Bean Queue queue() {
return new ActiveMQQueue("remotingQueue");
}
问题如下:
Type mismatch: cannot convert from ActiveMQQueue to Queue
Eclipse建议的解决方案是:
第一个解决方案解决了这个问题,但是当我运行应用程序时,它失败并显示以下消息:
class org.apache.activemq.command.ActiveMQQueue cannot be cast to class javax.jms.Queue
当我尝试在不进行投射的情况下运行应用程序时,我遇到了同样的问题。
使用 Eclipse 建议的第二个解决方案(即将方法返回类型更改为 ActiveMQueue)解决了该问题,但我不确定以这种方式配置队列是否能够实现与服务器端配置的队列同步的目标。服务器端定义队列如下,没有问题:
@Bean Queue queue() {
return new ActiveMQQueue("remotingQueue");
}
为什么这个定义在一个应用程序中有效,但在第二个应用程序中不起作用?
由于您使用的是
spring-boot-starter-activemq
的 3.1.3 版本,那么您正在传递性地使用此依赖项:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client-jakarta</artifactId>
<version>5.18.2</version>
<scope>compile</scope>
</dependency>
这是 Jakarta 依赖项,这意味着所有 JMS 对象都使用
jakarta
命名空间而不是 javax
命名空间。因此,您的代码应该使用 jakarta.jms.Queue
而不是 javax.jms.Queue
。
我无法说出为什么您的其他应用程序没有遇到同样的问题。我的猜测是它使用了不同的依赖项或者运行时环境不同。
最后,您应该尽可能避免使用实现对象(例如
ActiveMQQueue
),因为它会破坏代码的可移植性,并首先抵消使用 JMS 等 API 的主要好处之一。