使用ActiveMQ "Classic"迁移到Spring Boot 3

14

我正在尝试迁移到使用新的命名空间 jakarta.xx 而非 javax.xx 的 Spring Boot 3,但 ActiveMQ "Classic" 客户端尚未更新且已被弃用。是否有一种方法可以继续使用旧的 ActiveMQ 客户端?

我尝试了新的 ActiveMQ Artemis 客户端,但似乎它们与 ActiveMQ "Classic" 服务器不兼容。 包含旧的 ActiveMQ 客户端会导致无法使用 JMSTemplate 进行配置,因为 JMSTemplate 使用 jakarta.xx 并期望从 jakarta.xx 而非 javax.xx 获取 ConnectionFactory

编辑:没有成功,唯一的方法是升级到 artemis。这样代码库也几乎没有改变。

编辑:2023年4月:新的 ActiveMQ 客户端 已发布。您只需要将 Spring Boot Starter ActiveMQ 替换为更新版本并包含 this 即可。


1
请注意,Spring Boot 3 使用 Jakarta EE 9,而 Jakarta EE 9 又使用 Jakarta Messaging 3.0,其中包含了 JMS 2.0 的所有更改,而 ActiveMQ "Classic" 不支持这些更改。 - Justin Bertram
作为后续,您可以再次使用Spring Boot Starter ActiveMQ 2.7.12版本(应在Spring Boot 3.1.0 Parent中自动设置)。 - Samuel
5个回答

6
已发布兼容 Jakarta JMS 的 ActiveMQ 5.18.x 版本。我成功运行了该版本,且无需使用 Spring 5.3.x 依赖项:
已移除。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

并将代理程序与新的“雅加达客户端”依赖项一起包含:

<!-- 5.18 brings initial JMS 2.0 (javax.jms API) and Jakarta Messaging 3.1 (jakarta.jms API) client support -->
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-broker</artifactId>
    <version>5.18.1</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-client</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-client-jakarta</artifactId>
    <version>5.18.1</version>
</dependency>

我们现在可以使用未迁移的ActiveMQ安装在服务器上发送和接收消息,同时还可以与Spring Boot 2.7.x应用程序和3.0.5 Spring应用程序并行运行。


1
你需要 activemq-client-jakarta 5.18.1 版本来修复一个小 bug。 - Matt Pavlovich
我想补充一点,如果你想使用JmsTemplate,请不要忘记添加org.springframework:spring-jms依赖。 - Miroslav
使用嵌入式ActiveMQ怎么样?升级到Spring Boot 3.1.2之后,它无法启动。我还测试了spring-boot-starter-activemq,结果也是一样的。 - Azdy
1
@Azdy 嵌入式ActiveMQ尚不支持:“由于ActiveMQ的代理尚未支持JMS 3.0,因此嵌入式ActiveMQ代理的支持尚未恢复。” Spring Boot 3.1 - 发行说明 :( - Jacob van Lingen

5

为了继续在Spring 3和Jakarta EE 9中使用ActiveMQ 5.x,需要在ActiveMQ 5.x端进行两个更新-- JMS 2.0支持,然后支持javax.jms -> jakarta.jms命名空间更改。

第一部分是最大的,正在进行中。ActiveMQ 5.x主分支具有JMS 2.0的预览支持,并计划在不久之后提供Jakarta命名空间支持。

这是一个跟踪ActiveMQ 5.x中JMS 2.0进展的好页面

参考: https://activemq.apache.org/jms2

更新:Apache ActiveMQ 5.18.1包括启用Jakarta的客户端“activemq-client-jakarta”

编辑:此更改将添加对Spring Boot v3的支持:https://github.com/spring-projects/spring-boot/pull/35048


这个什么时候可能完成更新? - zachariahyoung
1
一个新的客户端已经发布。我下周会去查看它。 - Samuel
Jakarta JMS兼容版本ActiveMQ 5.18.0已发布[ANN] Apache ActiveMQ 5.18.0已经发布,但是它仍然缺乏Spring方面的支持。 - neorus
你需要5.18.1版本进行小错误修复。 - Matt Pavlovich

4

正如您所注意到的,目前没有支持Jakarta名称空间JMS依赖关系以及实际上没有支持JMS 2.0的ActiveMQ客户端,因此您确实需要转向其他解决方案,如ActiveMQ Artemis代理和ActiveMQ Artemis客户端或Qpid JMS AMQP客户端v2.1.0,这两个都支持JMS 2.0并使用Jakarta API。

如果您坚决要坚持使用ActiveMQ 5.x,可以尝试使用Qpid JMS v2.1.0客户端,它确实使用Jakarta JMS API,但是您需要相当谨慎,因为5.x代理不支持JMS 2.0,因此API的某些部分可能会触发意外行为。 5.x代理中的AMQP支持不像Artemis代理那样完全集成和JMS 2.0感知,因此您可能会遇到一些问题,如果您转向Artemis代理,则不会出现这些问题。

编辑:没有奏效,唯一的方法就是升级到artemis,这样代码库几乎不需要更改。


感谢您提供详细的说明。我只使用ActiveMQ发送和接收简单的队列消息。我将尝试Qpid,并在成功连接到ActiveMQ“Classic”服务器后更新我的问题。 - Samuel
请确保在ActiveMQ配置文件中启用了AMQP传输连接器,并将客户端指向正确的端口(AMQP默认端口是5672用于TCP,5671用于SSL)。 - Tim Bish
1
抱歉。我编辑了错误的评论。我想最干净的解决方案是升级到Spring Boot Artemis服务器。 - Samuel

2
我在Spring Boot 3.1.2中使用JmsTemplate和嵌入式ActiveMQ。所以我按照以下步骤进行了操作:
我添加了这个bean来提供嵌入式ActiveMQ:
```java @Bean public ConnectionFactory connectionFactory() { return new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false"); } ```
我添加了以下依赖项:
```xml javax.jms javax.jms-api 2.0.1 org.apache.activemq activemq-client-jakarta 5.18.2 org.springframework spring-jms 6.0.11 org.apache.activemq activemq-broker 5.18.2 org.apache.activemq activemq-client ```
我移除了以下内容:
```xml org.springframework.boot spring-boot-starter-activemq ```

现在你可以做相反的事情了。它再次包含在标准的spring-boot-starter-activemq中。 - Samuel
我刚刚找到了迁移到Spring Boot 3.1.2的方法。你有没有办法在spring-boot-starter-activemq中使用内嵌的ActiveMQ和JmsTemplate? - Azdy

1

在等待ActiveMQ更新至Jakarta EE 9期间,我已将其删除。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

并包含在内

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-client</artifactId>
    <version>5.17.3</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jms</artifactId>
    <version>5.3.24</version>
</dependency>

使用Spring Boot 3.0.0时,它的表现非常出色。


1
嗨,将Spring 5.3.x依赖项添加到Spring 6.0.x应用程序中听起来有些危险。 - Dale Ogilvie
谢谢,我会尝试那个解决方案,即使它有些取巧。 - Samuel
@Samuel,你解决了吗?我们的系统正在使用SpringIntegration和ActiveMQ。现在计划升级到SpringBoot 3,但问题是代理不在我们这边,所以我们不能轻易地切换到Artemis... - Artur Jarosz
嗨。我能够轻松添加这些依赖项,启动时也没有崩溃。但是我也没有看到“成功连接到队列”的日志消息。我将继续测试,希望在本周末之前完成。 - Samuel
嗨,提供的解决方案对我也起作用了。但是我必须添加这个依赖项。 <dependency>       <groupId>javax.jms</groupId>       <artifactId>javax.jms-api</artifactId>       <version>2.0.1</version>   </dependency> - Parul
请使用 activemq-client-jakarta v5.18.1。 - Matt Pavlovich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接