目前,很多项目,基本上发邮件,语音验证都在用这类的技术,甚至所有的异步操作都可以这样做。即使服务器宕机了,只要MQ服务还活着,下次项目服务启动后,还会继续执行下去。比如发邮件,还会接着发,不会出现重复。但是,也有很小的几率队列丢失,但是瑕不掩瑜,MQ作为一个中间组件,确实很好用
底层和术语简介:
JMS(Java Message Service)即java的消息服务,基于JVM消息代理的规范,对于ActivityMQ,是一个JMS消息代理的一个实现,就跟hibernate跟Jpa的关系一样(这货用Java开发的),本次演示使用这个
另外AMQP(Advanced Message Queuing Protocol),也是一个消息代理的规范,它不仅兼容JMS,还支持跨语言平台。它的主要实现就有ActivityMQ (这货是用Erlang开发的),下次演示使用这个
1,准备工作
1. 本实例所使用到的工具(软件和硬件):
- docker
- sts
- linux服务器一台(centOS 7.0)
略去新建项目的步骤,还用上次的项目,对于docker部署容器在这里不做演示,效果如下,端口说明:
61616 为消息代理接口 ,8161 为管理界面(springboot强大的一点是可以在程序中直接内嵌activityMQ,只需要在pom文件中加上以下代码,不需要安装这个,但是这个如果服务宕机了,也就没了。而且也无法看到图形化界面,在这里不支持这样做
org.apache.activemq activemq-broker
使用docker安装成功后的效果如下:
点击Manage ActiveMQ broker 经行登录操作(默认管理员账户密码为admin/admin)
2,代码部分
Spring对JMS的支持来自于:spring-jms,并提供了jmsTemplate来发送消息 Springboot使用sping.activemq的前缀来配置起连接属性
不过springboot都是有默认配置的,比如:
- spring.activemq.broker-url默认的是localhost:8161
- spring.activemq.in-memory默认是true,
- spring.activemq.pooled默认是false
另外,在pom。xml文件中加上依赖:
org.springframework spring-jms org.apache.activemq activemq-client
对activeMQ不多做介绍,篇幅不够
在这里,先定义一个生产者(发送消息者)的类,这个类需要实现org.springframework.jms.core.MessageCreator:
package com.lijunhao.activemq;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.Session;import org.springframework.jms.core.MessageCreator;/** * * @author Administrator * 测试所要发送的msg */public class MyMsg implements MessageCreator{ @Override public Message createMessage(Session session) throws JMSException { return session.createTextMessage("后端第一大帅哥!!"); }}
还有一个目的地类(所谓的消费者),这个类需要在方法上制定@JmsListener(destination= "my-mudidi")目的地是哪个
package com.lijunhao.activemq;import org.springframework.jms.annotation.JmsListener;import org.springframework.stereotype.Component;/** * 接收者(目的地) * @author Administrator * */@Componentpublic class MyReceiver { /** * 这个是要监听的目的地方法,添加@JmsListener注解 * @param msg */ @JmsListener(destination= "my-mudidi") public void receiverMsg(String msg){ System.out.println("来,大声告诉我,我就是:"+msg); }}
接下来,照旧,在controller中做测试
//这个可以直接注入 @Autowired private JmsTemplate jmsTemplate; /** * 测试activeMQ * @return */ @RequestMapping(value="/dashuaige") public String getTestActiveMQ(){ /** * 这个方法第一个参数是目的地。就是消费者 * 第二个参数是一个类 MessageCreator,这个就是MyMsg那个implements MessageCreator的类 */ System.out.println("准备开始发送到activeMQ --START"); jmsTemplate.send("my-mudidi", new MyMsg()); System.out.println("准备开始发送到activeMQ --END"); return "index"; }
控制台结果如下:
而管理控制台的结果
发送前(为了做测试,开始是有了2条消息的),可以看到queues的name是my-mudidi:
发送后: