一、ActiveMQ
-
介绍
Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件;由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。下载地址:http://activemq.apache.org/activemq-5153-release.html 官方教程:http://activemq.apache.org/getting-started.html
-
网页地址与queue目录介绍
浏览器输入:http://127.0.0.1:8161/admin/ 用户名与密码:adminqueue目录介绍:
Name:队列名称。
Number Of Pending Messages:等待消费的消息个数。
Number Of Consumers:当前连接的消费者数目
Messages Enqueued:进入队列的消息总个数,包括出队列的和待消费的,这个数量只增不减。
Messages Dequeued:已经消费的消息数量。 -
ActiveMQ之点对点操作
官方参考网址 :目录:4.13.1
a、引入依赖:<!-- 整合消息队列ActiveMQ --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> <!-- 若配置线程池则加入 --> <dependency> <groupId>org.messaginghub</groupId> <artifactId>pooled-jms</artifactId> </dependency>
b、application.properties配置文件
#整合jms测试,安装在别的机器,防火墙和端口号记得开放,若防火墙已关闭,此处可忽略 spring.activemq.broker-url=tcp://127.0.0.1:61616 #集群配置 #spring.activemq.broker-url=failover:(tcp://localhost:61616,tcp://localhost:61617) spring.activemq.user=admin spring.activemq.password=admin #使用连接池 spring.activemq.pool.enabled=true #连接池最大连接数 spring.activemq.pool.max-connections=100
c、在启动类加注解
@SpringBootApplication @EnableJms //开启支持jms public class Springboot07Application { @Bean /** * 将当前方法注入到spring,拿到一个Queue对象 * @Component 将整个类注入到spring产生一个bean对象 * @Bean 是将当前方法注入到spring,把当前方法返回的对象作为-个bean对象使用 */ public Queue queue(){ return new ActiveMQQueue("test.queue"); } }
d、提供一个发送消息的服务 ----- 写一个service层
//发送消息的服务,也叫做消息生产者 public interface ActiveService { /** * * @param destination //指定接收消息的对列名 * @param msg //发送的消息 */ public void sendMsg(Destination destination,String msg); /** * 使用默认消息队列 * @param msg */ public void defaultSendMsg(String msg); }
e、实现接口
通过JmsMessgingTemplate发送消息@Service public class ActiveServiceImpl implements ActiveService { @Autowired private Queue queue; //队列对象 @Autowired private JmsMessagingTemplate template; //消息队列模板 ,类似于jdbcTemplate模板 @Override public void sendMsg(Destination destination, String msg) { //将消息发送到指定消息队列destination template.convertAndSend(destination,msg); } @Override public void defaultSendMsg(String msg) { //将消息发送到默认消息队列 template.convertAndSend(msg); } }
f、从controller层接收消息
这里使用了JsonData工具类,返回json数据@RestController @RequestMapping("/mq") public class ActiveController { @Autowired private ActiveService activeService; @RequestMapping("/active") //这是前台发过来的消息 public Object active(String msg){ Destination destination = new ActiveMQQueue("test.queue");//指定接收队列 activeService.sendMsg(destination,msg); return JsonData.buildSuccess(); } }
g、在jsm文件夹中创建消息消费者,消费掉刚才发送的消息
@Component public class ActiveConsumer { /** * 监听活动中的消息,并消费 --这是实时监听 * @JmsListener 消息监听(实时监听,只有发现有消息发送过来,会立刻消费 * @param msg */ @JmsListener(destination = "test.queue") //指定接收队列 public void consumeMsg(String msg){ System.out.println("ActiveConsume收到的报文是:" + msg); } }
h、测试
-
ActiveMQ之发布订阅模式
订阅模式,一个消息可以被多个消费者消费,这是和点对点模式的最大区别。同时也支持点对点和发布订阅同时使用。a、在配置文件配置
#开启订阅模式,默认是点对点模式 spring.jms.pub-sub-domain=true
b、启动类同样需要@EnableJms ,然后加入一个topic 主题对象
/** * 订阅者模式 --发布者 * @return */ @Bean public Topic topic(){ return new ActiveMQTopic("test.topic");//指定接收队列 }
c、业务层提供生产者(也就是消息发布者)
/** * 订阅者模式:消息发布者 * @param msg */ public void producer(String msg);
d、实现业务层
@Autowired private Topic topic; @Override public void producer(String msg) { template.convertAndSend(topic,msg); }
e、创建消费者
@Component public class TopicConsumer { /** * 订阅模式消费者 * @param msg */ @JmsListener(destination = "test.topic") //指定接收队列 public void consumer1(String msg){ System.out.println("消费者1报文:" + msg); } @JmsListener(destination = "test.topic") public void consumer2(String msg){ System.out.println("消费者2报文:" + msg); } @JmsListener(destination = "test.topic") public void consumer3(String msg){ System.out.println("消费者3报文:" + msg); } }
f、在controller层编写代码
/** * 订阅者模式 --消息生产 * @param msg * @return */ @RequestMapping("/topic") public Object topic(String msg){ activeService.producer(msg); return JsonData.buildSuccess(); }
g、测试
-
同时支持点对点和订阅者模式
a、修改配置文件,把
spring.jms.pub-sub-domain=true
注释
b、在启动类添加代码/** * 同时支持点对点和订阅者模式 * @param activeMQConnectionFactory * @return */ @Bean public JmsListenerContainerFactory<?> jmsListenerContainerTopic(ConnectionFactory activeMQConnectionFactory) { DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory(); bean.setPubSubDomain(true); bean.setConnectionFactory(activeMQConnectionFactory); return bean; }
c、修改订阅者注解
在原订阅者模式注解@JmsListener
追加containerFactory="jmsListenerContainerTopic"
@Component public class TopicConsumer { /** * 订阅模式消费者 * @param msg */ @JmsListener(destination = "test.topic",containerFactory="jmsListenerContainerTopic") public void consumer1(String msg){ System.out.println("消费者1报文:" + msg); } @JmsListener(destination = "test.topic",containerFactory="jmsListenerContainerTopic") public void consumer2(String msg){ System.out.println("消费者2报文:" + msg); } @JmsListener(destination = "test.topic",containerFactory="jmsListenerContainerTopic") public void consumer3(String msg){ System.out.println("消费者3报文:" + msg); } }
d、测试