Spring Boot 应用程序中的 JMS

您可以在 Spring Boot 应用程序中使用 JMS ,通过使用消息传递提供程序 (例如 IBM® MQ) 进行可靠的异步通信来发送和接收消息。

要在 Spring Boot 应用程序中使用 JMS,请在 Spring Boot 应用程序的依赖项中添加 JMS 工具,以提供必要的 Java 库。 例如,在 Gradle ,
implementation("org.springframework.integration:spring-integration-jms")
compileOnly("javax.jms:javax.jms-api")
或者Maven,
<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-jms</artifactId>
</dependency>
<dependency>
    <groupId>javax.jms</groupId> 
    <artifactId>javax.jms-api</artifactId>
    <scope>provided</scope>
</dependency>
要使用 JMS 消息传递提供程序来发送和接收消息,可以像在 Java EE 应用程序中使用 JMS 一样,在 Liberty server.xml 中定义 JMS 连接工厂。 然后,可以使用此连接工厂通过使用 JmsTemplate 对象以及下列其中一项来引用远程 IBM MQ 队列管理器:
  1. 在带@Bean注释connectionFactory(中执行连接工厂的JNDI查找并返回连接工厂。
  2. 在 Spring 应用程序属性中的 spring.jms.jndi-name 中命名连接工厂。 Spring Boot 然后使用 application.properties中指定的连接工厂来创建 JmsTemplate 。
注: 在选项 2 中,还可以配置从 application.properties 文件将 Spring 应用程序连接到所需队列管理器所需的所有连接工厂属性。 所有属性都在通用应用程序属性中定义。 但是,这会将应用程序直接与队列管理器绑定在一起,并且使用 JNDI 是一种更灵活的方法。

消息驱动的 POJO (MDP) 用于处理 Spring Boot中的入局消息。 @EnableJms 注释用于 Spring Boot 配置类,以便发现注释为 @JmsListener 的方法。 @JMSListener 注释将方法标记为接收入局消息的 JMS 消息侦听器的目标。

如果您希望这些MDP能够使用JCICS API,则需要将 TaskExecutor 绑定到 JmsListenerContainerFactory。 这可以实现如下:
@Bean
public TaskExecutor taskExecutor()
{
    return new DefaultManagedTaskExecutor();
}

@Bean
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory) 
{
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    factory.setTaskExecutor(taskExecutor());
    return factory;
}
注: 这需要使用 jndi-1.0 和 concurrent-1.0 Liberty 功能部件。

Spring Boot @Transactional 注释还可以用于 @JMSListener 注释的方法,以表示将使用同一容器管理的 JTA 全局事务来协调从队列和 CICS® UOW 接收消息。