12 Spring boot message--activemq

Spring Framework框架为集成消息系统提供了扩展(extensive) 支持:从使
用 JmsTemplate 简化JMS API,到实现一个能够异步接收消息的完整的底层设
施。Spring AMQP提供一个相似的用于'高级消息队列协议'的特征集,并且Spring
Boot也为 RabbitTemplate 和RabbitMQ提供了自动配置选项。Spring Websocket
提供原生的STOMP消息支持,并且Spring Boot也提供了starters和自动配置支持。

JMS(Java Message Service)

JMS大致可以分为两种功能区域,消息的生产和消费。JmsTemplate用于消息的生产和异步消息接收。Spring提供了许多消息监听器容器,您可以使用它们来创建消息驱动的POJO(MDP)。 Spring还提供了一种创建消息监听器的声明方式。

org.springframework.jms.core包提供了使用JMS的核心功能。JmsTemplate对资源的使用和释放就像JbdcTemplate一样。JmsTemplate提供了多种方便的方法用于发送消息,异步消费消息,向用户暴露JMS session和消息生产者。

org.springframework.jms.support包提供了JMSException异常的翻译功能。
org.springframework.jms.support.converter包提供了Java对应和JMS 消息之间的转化。
org.springframework.jms.support.destination包提供了多种管理JMS目的端的策略。
org.springframework.jms.annotation包提供了必要的基础框架以支持使用@JmsListener注解驱动。
org.springframework.jms.config包提供jms命名空间的解析器实现以及配置侦听器容器和创建侦听器端点的java配置支持。
org.springframework.jms.connection包提供了合适的ConnectionFacotry的实现用于独立应用程序。

JmsTemplate使用

JmsTemplate是JMS核心包中的中心类,为在发送和异步接受消息的对资源的创建和释放简化了操作。
编码使用JmsTemplate仅仅需要实现一个明确定义高级别的回调接口。MessageCreator回调接口用JmsTemplate中提供的Session来创建消息;SessionCallback提供JMS session;ProducerCalback暴露一对一的Session和MessageProducer。
Jms接口提供两种发送消息的方法,一种使用传输模式,优先级和time-to-live作为服务质量参数(QOS),另一种不是QOS参数而是默认值。
JmsTemplate是线程安全的类,所以可以配置一个并在多个地方引用。JmsTemplate是稳定的,在内部有一个到ConnectionFactory的引用,但是这种状态不是构建在会话之上。在Spring framework4.1中,JmsMessagingTemplate构建在JmsTemplate之上提供org.springframework.messaging.Message消息抽象的集成。

连接

JmsTemplate需要引用ConnectionFactory。 ConnectionFactory是JMS规范的一部分,并作为使用JMS的入口点。 客户端应用程序将其用作工厂以创建与JMS提供程序的连接,并封装各种配置参数,其中许多是特定于供应商的,例如SSL配置选项。

使用SingleConnectionFactory
spring提供了connectionFactory接口的实现,SingleConnectionFactory,通过调用createConnection方法返回同一个connection并忽略close的调用。

使用cachingConnectionFactory
cachingConnectionFactory继承自SingleConnectionFactory并添加了session,Messageproducer和MessageConsumer实例的缓存。初始缓存大小设置为1.

消息监听容器

消息监听容器用来从消息队列中接收消息并驱动MessageListener注入,负责所有消息的接收和分发对应的linstener处理。两种类型的消息监听容器:
SimpleMessageListenerContainer:在启动时创建固定数量的JMS session和消费者,使用MessageConsumer.setMessageListener()标准方法注册linstener,并由这个linstener处理回调。
DefaultMessageListenerContainer:对比于SimpleMessageListenerContainer,该容器允许在运行期间动态调整也能参与到外部事物管理。当时用JtaTransactionManager配置时每个接收的消息就会注册为XA事务。

1,在测试环境安装activemq,/usr/activemq/bin/activemq start 启动
2,使用admin/admin登陆,并创建两个用于测试的队列,firstQueue,secondQueue
3,添加Spring boot对activemq的支持

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

4,注入队列

    @Bean
    public Queue firstQueue(){

        return new ActiveMQQueue("firstQueue");
    }

    @Bean
    public Queue secondQueue(){

        return new ActiveMQQueue("secondQueue");
    }

5,配置MessageConverter

    @Bean
    public MessageConverter getMessageConverter(){

        return new SimpleMessageConverter();
    }

6,配置connectionFactory

    @Bean
    public ConnectionFactory getConnectionFactory(){

        return new CachingConnectionFactory(getActiveMQConnectionFactory());
    }

    public ActiveMQConnectionFactory getActiveMQConnectionFactory(){

        return new ActiveMQConnectionFactory("admin","admin","tcp://ip:61616");
    }

7,配置JmsTemplate

    @Bean
    public JmsTemplate jmsTemplate(){

        JmsTemplate jmsTemplate =  new JmsTemplate(getConnectionFactory());
        jmsTemplate.setMessageConverter(getMessageConverter());
        return jmsTemplate;
    }

8,定义生产者

@Component
public class Producer implements CommandLineRunner {

    @Autowired
    private Queue firstQueue;

    @Autowired
    private Queue secondQueue;

    @Autowired
    private JmsTemplate jmsTemplate;


    @Override
    public void run(String... args) throws Exception {

        for (int i = 0; i < 20; i++) {

            if(i%2 == 0){

                this.jmsTemplate.convertAndSend(this.firstQueue,"activemq firstQueue"+i);
            }else{

                this.jmsTemplate.convertAndSend(this.secondQueue,"activemq secondQueue"+i);
            }

            Thread.sleep(2000);
        }

    }
}

9,定义消费者

@Component
public class Consumer {

    @JmsListener(destination = "firstQueue",containerFactory = "myFactory")
    public void receiveMessage(String text){

        System.err.println("received firstQueue "+text);
    }

    @JmsListener(destination = "secondQueue")
    public void receiveSecondQueue(String message){

        System.err.println("received second queue "+ message);
    }
}

运行程序可看到如下输出:

received firstQueue activemq firstQueue4
received second queue activemq secondQueue5
received firstQueue activemq firstQueue6
received second queue activemq secondQueue7
received firstQueue activemq firstQueue8
received second queue activemq secondQueue9
received firstQueue activemq firstQueue10
received second queue activemq secondQueue11
received firstQueue activemq firstQueue12
received second queue activemq secondQueue13
received firstQueue activemq firstQueue14
received second queue activemq secondQueue15
received firstQueue activemq firstQueue16
received second queue activemq secondQueue17
received firstQueue activemq firstQueue18
received second queue activemq secondQueue19

activemq队列有如下信息:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容