Spring Integration 和 ActiveMQ 的 Spring Boot 示例

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

在这篇文章中,我将引导您使用 Spring Boot 通过 Spring Integration 和 ActiveMQ 设置一个 Hello World 示例。我们将配置 Spring Integration 以侦听 ActiveMQ 队列。为了好玩,我将使用 Spock 将消息放入队列,我们​​可以看到 Spring Integration 接收 JMS 消息并将消息打印到控制台。

Spring Boot 项目设置

弹簧初始化器

使用 IntelliJ 创建一个新项目,我将选择使用 Spring Initializr 来创建我的新 Spring Boot 项目的选项。 IntellIj 对话框可以轻松创建 Spring Boot 项目。

在本例中,我在撰写本文时选择了最新版本的 Spring Boot (1.3.0.M3),并选择了 Spring Integration。

在 IntelliJ 中完成这些步骤后,我将有一个新的 Maven 项目用于此示例。

Spring Integration 和 ActiveMQ 依赖关系

Spring Boot 在引入基本依赖项方面做得非常好。使用 IntelliJ 中的 Maven 支持,我们可以查看项目的 Maven 依赖项。您可以看到,通过 Spring Boot 工件,我们为 Spring Integration 引入了基本依赖项。

在撰写本文时,Spring Initializr 不直接支持 ActiveMQ。我没有查看 Spring Boot 团队是否为此定义了 Maven 工件。但是,添加 Spring Integration 和 ActiveMQ 所需的依赖项非常简单。

注意到我没有向依赖项添加版本信息了吗?它继承自父 Spring Boot Maven POM。


 <!--JMS support-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-broker</artifactId>
        </dependency>


ActiveMQ Spring 引导配置

与许多其他事物一样,Spring Boot 使我们配置 ActiveMQ 的任务变得更加容易。出于示例的目的,我们希望使用嵌入式 ActiveMQ 代理。这在开发使用 ActiveMQ 的 Spring 项目时很常见。在 使用 Spring 开发企业应用程序 时,您通常会使用 ActiveMQ 嵌入式代理进行开发,然后进行配置以在生产中使用 IBM 的 MQSeries。

ActiveMQ 代理

通过在我们的构建路径上使用 ActiveMQ,Spring Boot 将自动设置一个 ActiveMQ 代理。我们需要设置几个属性以使其成为内存代理,而无需连接池。我们可以通过为 Spring Boot 设置两个属性来做到这一点。

应用程序.properties


 <!--JMS support-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-broker</artifactId>
        </dependency>


ActiveMQ 队列配置

我们还需要为我们的示例设置一个队列。我们可以在 Spring Java 配置类中执行此操作,如下所示。

ActiveMQConfig.java


 <!--JMS support-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-broker</artifactId>
        </dependency>


这就是我们为示例配置 ActiveMQ 所需要做的全部工作。 Spring Boot 会处理剩下的事情。

弹簧集成配置

Spring Integration JMS 通道适配器

Spring Integration 带有许多不同的通道适配器。在这种情况下,我们需要配置一个 JMS 通道适配器。这将充当 Spring Integration Messaging 和 JMS Messaging 之间的透明桥梁。

在下面的 Spring Integration XML 配置中,我定义了一个 Spring Integration JMS 通道适配器。目标属性设置为我们在上面定义的 ActiveMQ 队列 bean 的名称。 (当使用 Spring Java 配置时,bean 引用变成继承自配置类中的方法名称。)我还在配置中添加了一个 Spring Integration 通道。

这充当桥梁,来自 JMS 队列的消息将被发送到 Spring Integration 通道,而发送到 Spring Integration 通道的消息将被传递到 JMS 队列。

si-config.xml


 <!--JMS support-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-broker</artifactId>
        </dependency>

服务问好

今天,我们将使用一个简单的服务作为示例。它是一个 Spring 服务组件,它只需要一个字符串并将其打印到控制台。

SayHelloService.java


 <!--JMS support-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-broker</artifactId>
        </dependency>


Spring Integration 服务激活器配置

接下来我们需要添加一个Spring Integration Service Activator。这是 Spring Integration 将用来处理消息的内容。我们只需要将以下内容添加到我们的 Spring Integration XML 文件中。

/resources/spring/si-config.xml


 <!--JMS support-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-broker</artifactId>
        </dependency>


春季启动配置

我们需要将 Spring Integration XML 配置文件告诉 Spring Boot。我们可以通过向 Spring Boot 应用程序类文件添加 ImportResource 注释来实现这一点,如下所示。

HelloWorldSiActivemqApplication.class


 <!--JMS support-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-broker</artifactId>
        </dependency>


斯波克配置

Maven 依赖项

要启用 Spock 支持,请将以下依赖项添加到您的 Maven pom 文件中。


 <!--JMS support-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-broker</artifactId>
        </dependency>


Maven 编译器插件

Spock 测试类是用 Groovy 编写的。您需要将 Groovy 编译器添加到您的 Maven 构建中。我喜欢使用 Groovy Eclipse 编译器。将以下插件添加到您的构建插件中。


 <!--JMS support-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-broker</artifactId>
        </dependency>


使用 Spock 发送 JMS 消息

发送 JMS 消息的方法有很多种。我选择在此示例中使用 Spock 主要是为了好玩。我喜欢使用 Spock。在此示例中,我将 Spock 设置为使用与 Spring Boot 应用程序相同的 Spring 上下文。 Spring Boot Application 类实际上是一个 Spring Configuration 类,您可以将其作为 Spring Integration 测试的源代码。

Spock Spring 集成测试

在这个 Spock Integration 测试中,我使用 Spring Boot 配置自动装配 JMS 连接工厂的一个实例,并设置一个 JMS 生产者来发送文本消息。这将在我们配置 Spring Integration 侦听的同一个 ActiveMQ JMS 队列上放置一条文本消息。

SayHellowServiceJMSIT.groovy


 <!--JMS support-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-broker</artifactId>
        </dependency>


运行 Spock 集成测试

使用 IntelliJ,只需右键单击测试方法,然后单击“运行”,即可运行 Spock 集成测试。

测试输出


 <!--JMS support-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-broker</artifactId>
        </dependency>


Spring Boot 的 Spring Integration JMS 配置

故意在 Spring Integration 配置中留下一个错误来演示这个错误。 Spring Integration 默认配置正在寻找一个名为“connectionFactory”的 Spring Bean 。默认情况下,Spring Boot 使用名称“jmsConnectionFactory”创建 JMS 连接工厂。

该解决方案很容易实施。我们只需要更新 Spring Integration 通道适配器以使用 Spring Bean“jmsConnectionFactory”而不是它的默认值“connectionFactory”。

si-config.xml


 <!--JMS support-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-broker</artifactId>
        </dependency>


运行更新的配置

当我们再次运行 Spock 集成测试时,我们可以在控制台输出中看到我们预期的 hello world 消息。

测试输出


 <!--JMS support-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-broker</artifactId>
        </dependency>


结论

在这个 Spring Framework 示例中,我向您展示了使用 Spring Boot 配置 Active MQ 代理以与 Spring Integration 一起使用是多么容易。这篇博文的灵感来自一个真实世界的例子,在这个例子中,我 使用 Spring Framework 编写了一个企业服务 。我需要使用 Spring Integration 来使用来自 MQSeries JMS 队列的消息。 MQSeries 很棒,但它的重量不是很轻,也不适合集成测试。因此,我编写了集成测试以使用嵌入式 ActiveMQ 代理。您可以看到使用 Spring Boot 提供 ActiveMQ 代理和 依赖注入 来连接一切是多么容易。