SpringBoot(13) - 消息(1) - JMS(1)ActiveMQ

参考:https://docs.spring.io/spring-boot/docs/1.5.17.RELEASE/reference/htmlsingle/#boot-features-messaging

 

Spring Framework为与消息传递系统的集成提供了广泛的支持:从使用JmsTemplate简化JMS API的使用到异步接收消息的完整基础结构。Spring AMQP为“高级消息队列协议”提供了类似的功能集,Spring Boot还为RabbitTemplate和RabbitMQ提供了自动配置选项。 Spring WebSocket本身也支持STOMP消息传递,Spring Boot通过启动器和少量自动配置支持STOMP消息传递。 Spring Boot也支持Apache Kafka。

 

JMS

javax.jms.ConnectionFactory接口提供了一种创建javax.jms.Connection以与JMS代理进行交互的标准方法。 虽然Spring需要一个ConnectionFactory来使用JMS,但您通常不需要自己直接使用它,而是可以依赖更高级别的消息传递抽象(有关详细信息,请参阅Spring Framework参考文档的相关部分)。Spring Boot还会自动配置发送和接收消息所需的基础结构。

1 ActiveMQ的支持

当SpringBoot在类路径下探测到ActiveMQ时,会自动配置一个ConnectionFactory。如果broker存在,则会自动启动并配置嵌入式代理(只要通过配置未指定broker URL)。

注:假如添加了spring-boot-starter-activemq依赖,则也会添加连接或嵌入ActiveMQ实例所需的依赖项,以及与JMS集成的Spring基础结构。

ActiveMQ可以通过spring.activemq.*进行配置。例如,可以在application.properties配置以下属性:

spring.activemq.broker-url=tcp://192.168.1.210:9876
spring.activemq.user=admin
spring.activemq.password=secret

还可以通过添加org.apache.activemq:activemq-pool依赖项来池化JMS资源,并相应地配置PooledConnectionFactory:

spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=50

注:查看ActiveActiveMQProperties类获取更多属性。还可以注册实现了ActiveMQConnectionFactoryCustomizer接口的任意数量的bean,自定义更高级的配置。

默认情况下,如果destination不存在,则ActiveMQ会创建destination,因此将根据提供的名称解析destination。

 

2.  Artemis的支持

参考这篇博客:https://blog.csdn.net/guiliguiwang/article/details/82116294

 

3. 发送消息

Spring的JmsTemplate是自动配置,可以直接通过@AutoWired注入。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyBean {
    private final JmsTemplate jmsTemplate;

    @Autowired
    public MyBean(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }
    // ...
}

注:JmsMessagingTemplate可以以类似的方式注入。假如定义了DestinationResolver或MessageConverter的bean,它们自动关联到自动配置的JmsTemplate。

 

4. 接收消息

当存在JMS基础结构时,可以使用@JmsListener对任何bean进行注释以创建监听器端点。 如果未定义JmsListenerContainerFactory,则会自动配置默认值。 如果定义了DestinationResolver或MessageConverter bean,它们将自动关联到默认工厂。

默认情况下,默认工厂是事务性的。 如果在存在JtaTransactionManager的基础结构中运行,则默认情况下它将与侦听器容器关联。 如果不是,则启用sessionTransacted标志。 在后一种情况下,可以通过在监听器方法(或其委托)上添加@Transactional,将本地数据存储事务与传入消息的处理相关联。 这将确保在本地事务完成后确认传入消息。 这还包括发送已在同一JMS会话上执行的响应消息。

以下组件在someQueue destination上创建一个监听器端点:

@Component
public class MyBean {
    @JmsListener(destination = "someQueue")
    public void processMessage(String content) {
        // ...
    }
}

注:查看@EnableJms文档获取更多内容。(可以仔细看下这个注解,源码里有很多示例)

假如需要创建更多的JmsListenerContainerFactory实例或者假如只是想要覆盖默认配置,Spring Boot提供了一个DefaultJmsListenerContainerFactoryConfigurer,可以使用它来初始化DefaultJmsListenerContainerFactory,其设置与自动配置的设置相同。

例如,以下示例中自定义了一个使用特定MessageConverter的工厂:

@Configuration
static class JmsConfiguration {

    @Bean
    public DefaultJmsListenerContainerFactory myFactory(DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        configurer.configure(factory, connectionFactory());
        factory.setMessageConverter(myMessageConverter());
        return factory;
    }
}

然后使用任意添加了@JmsListener注解的方法使用:

@Component
public class MyBean {

    @JmsListener(destination = "someQueue", containerFactory="myFactory")
    public void processMessage(String content) {
        // ...
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值