avtivex java_SpringBoot 2.x (13):整合ActiveMQ

ActiveMQ5.x不多做介绍了,主要是SpringBoot的整合

特点:

1)支持来自Java,C,C ++,C#,Ruby,Perl,Python,PHP的各种跨语言客户端和协议

2)支持许多高级功能,如消息组,虚拟目标,通配符和复合目标

3) 完全支持JMS 1.1和J2EE 1.4,支持瞬态,持久,事务和XA消息

4) Spring支持,ActiveMQ可以轻松嵌入到Spring应用程序中,并使用Spring的XML配置机制进行配置

5) 支持在流行的J2EE服务器(如TomEE,Geronimo,JBoss,GlassFish和WebLogic)中进行测试

6) 使用JDBC和高性能日志支持非常快速的持久化

下载:

实际开发推荐部署到Linux系统,具体操作网上也有教程

我这里为了方便,直接安装在本地Windows机器上

如果想了解更多,查看官方文档:

进入bin目录win64目录启动activemq.bat即可

访问localhost:8161进入首页

访问http://localhost:8161/admin/进入管理页面,默认用户名和密码都是admin

整合:

依赖

org.springframework.boot

spring-boot-starter-activemq

连接池

org.apache.activemq

activemq-pool

基本的配置

# ActiveMQ

spring.activemq.broker-url=tcp://127.0.0.1:61616spring.activemq.user=admin

spring.activemq.password=admin

spring.activemq.pool.enabled=true

spring.activemq.pool.max-connections=100

使用ActiveMQ必须要在SpringBoot启动类中开启JMS,并进行配置

packageorg.dreamtech.avtivemq;importjavax.jms.ConnectionFactory;importorg.apache.activemq.ActiveMQConnectionFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.annotation.Bean;importorg.springframework.core.env.Environment;importorg.springframework.jms.annotation.EnableJms;importorg.springframework.jms.core.JmsMessagingTemplate;importorg.springframework.jms.core.JmsTemplate;

@SpringBootApplication

@EnableJmspublic classAvtivemqApplication {public static voidmain(String[] args) {

SpringApplication.run(AvtivemqApplication.class, args);

}

@AutowiredprivateEnvironment env;

@BeanpublicConnectionFactory connectionFactory() {

ActiveMQConnectionFactory connectionFactory= newActiveMQConnectionFactory();

connectionFactory.setBrokerURL(env.getProperty("spring.activemq.broker-url"));

connectionFactory.setUserName(env.getProperty("spring.activemq.user"));

connectionFactory.setPassword(env.getProperty("spring.activemq.password"));returnconnectionFactory;

}

@BeanpublicJmsTemplate genJmsTemplate() {return newJmsTemplate(connectionFactory());

}

@BeanpublicJmsMessagingTemplate jmsMessageTemplate() {return newJmsMessagingTemplate(connectionFactory());

}

}

点对点模型:

首先实现消息的发送

packageorg.dreamtech.avtivemq.service;importjavax.jms.Destination;/*** 消息生产

*

*@authorXu Yiqing

**/

public interfaceProducerService {/*** 使用指定消息队列发送

*

*@paramdestination

*@parammessage*/

void sendMsg(Destination destination, finalString message);

}

packageorg.dreamtech.avtivemq.service.impl;importjavax.jms.Destination;importorg.dreamtech.avtivemq.service.ProducerService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.jms.core.JmsMessagingTemplate;importorg.springframework.stereotype.Service;

@Servicepublic class ProducerServiceImpl implementsProducerService {

@AutowiredprivateJmsMessagingTemplate jmsTemplate;

@Overridepublic voidsendMsg(Destination destination, String message) {

jmsTemplate.convertAndSend(destination, message);

}

}

packageorg.dreamtech.avtivemq.controller;importjavax.jms.Destination;importorg.apache.activemq.command.ActiveMQQueue;importorg.dreamtech.avtivemq.service.ProducerService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;

@RestControllerpublic classOrderController {

@AutowiredprivateProducerService producerService;

@GetMapping("/order")privateObject order(String msg) {

Destination destination= new ActiveMQQueue("order.queue");

producerService.sendMsg(destination,msg);return "order";

}

}

访问:http://localhost:8080/order?msg=demo,然后查看ActiveMQ界面:

fef592458462f80f5428fa1924454d80.png

有生产者就就有消费者:监听消息队列

packageorg.dreamtech.avtivemq.jms;importorg.springframework.jms.annotation.JmsListener;importorg.springframework.stereotype.Component;

@Componentpublic classOrderConsumer {/*** 监听指定消息队列

*

*@paramtext*/@JmsListener(destination= "order.queue")public voidreceiveQueue(String text) {

System.out.println("[ OrderConsumer收到的报文 : " + text + " ]");

}

}

由于实时监听,一启动SpringBoot就会打印:

[OrderConsumer收到的报文 : demo]

发布订阅模型:比如抖音小视频,某网红发布新视频,多名粉丝收到消息

默认ActiveMQ只支持点对点模型,想要开启发布订阅模型,需要进行配置

spring.jms.pub-sub-domain=true

Spring管理主题对象

@BeanpublicTopic topic() {return new ActiveMQTopic("demo.topic");

}

发布者

/*** 消息发布者

*

*@parammsg*/

void publish(String msg);

@AutowiredprivateJmsMessagingTemplate jmsTemplate;

@AutowiredprivateTopic topic;

@Overridepublic voidpublish(String msg) {

jmsTemplate.convertAndSend(topic, msg);

}

@AutowiredprivateProducerService producerService;

@GetMapping("/topic")privateObject topic(String msg) {

producerService.publish(msg);return "success";

}

订阅者(消费者):一人发布,多人订阅

packageorg.dreamtech.avtivemq.jms;importorg.springframework.jms.annotation.JmsListener;importorg.springframework.stereotype.Component;

@Componentpublic classTopicConsumer {

@JmsListener(destination= "demo.topic")public voidreceiver1(String text) {

System.out.println("TopicConsumer : receiver1 : " +text);

}

@JmsListener(destination= "demo.topic")public voidreceiver2(String text) {

System.out.println("TopicConsumer : receiver2 : " +text);

}

@JmsListener(destination= "demo.topic")public voidreceiver3(String text) {

System.out.println("TopicConsumer : receiver3 : " +text);

}

}

启动项目,访问:

http://localhost:8080/topic?msg=666

打印如下

TopicConsumer : receiver1 : 666TopicConsumer : receiver3 :666TopicConsumer : receiver2 :666

那么点对点和发布订阅模型可以一起使用吗?

不可以

如何配置?

1.注释掉 #spring.jms.pub-sub-domain=true

2.加入Bean:给topic定义独立的JmsListenerContainer

@Beanpublic JmsListenerContainerFactory>jmsListenerContainerTopic(ConnectionFactory activeMQConnectionFactory) {

DefaultJmsListenerContainerFactory bean= newDefaultJmsListenerContainerFactory();

bean.setPubSubDomain(true);

bean.setConnectionFactory(activeMQConnectionFactory);returnbean;

}

3.@JmsListener如果不指定独立的containerFactory的话是只能消费queue消息

@JmsListener(destination = "demo.topic", containerFactory = "jmsListenerContainerTopic")public voidreceiver1(String text) {

System.out.println("TopicConsumer : receiver1 : " +text);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值