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界面:
有生产者就就有消费者:监听消息队列
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);
}