案例:也就是说一个系统跟另一个系统之间进行通信的时候,假如系统A希望发送一个消息给系统B让他去处理。但是系统A不关注系统B到底怎么处理或者有没有处理好,所以系统A把消息发送给MQ然后就不管这条消息的“死活了”,接着系统B从MQ里面消费出来处理即可。至于怎么处理,是否处理完毕,什么时候处理都是系统B的事儿与系统A无关。
应用系统之间解耦合
发送者和接受者不必了解对方,只需要确认消息。发送者和接受者不必同时在线。
整体架构
MQ缺点
两个系统之间不能同步调用,不能实时回复,不能响应某个调用的回复。
1.6 CentOS7安装ActiveMQ cd /root mkdir active_mq tar -xzvf apache-activemq-5.14.0-bin.tar.gz # /etc/init.d/目录增加增加activemq文件 cd /etc/init.d/ vim activemq #!/bin/sh # # /etc/init.d/activemq # chkconfig: 345 63 37 # description: activemq servlet container. # processname: activemq 5.14.0 # Source function library. #. /etc/init.d/functions # source networking configuration. #. /etc/sysconfig/network export JAVA_HOME=http://www.likecs.com/root/java/jdk1.8.0_221 export CATALINA_HOME=http://www.likecs.com/root/active_mq/apache-activemq-5.14.0 case $1 in start) sh $CATALINA_HOME/bin/activemq start ;; stop) sh $CATALINA_HOME/bin/activemq stop ;; restart) sh $CATALINA_HOME/bin/activemq stop sleep 1 sh $CATALINA_HOME/bin/activemq start ;; esac exit 0 # 对activemq文件授予权限 chmod 777 activemq # 设置开机启动并启动activemq chkconfig activemq on service activemq start # 启动时指定日志输出文件,activemq日志默认的位置是在:%activemq安装目录%/data/activemq.log service activemq start > /root/active_mq/activemq.log # 访问地址:地址:8161/ # 默认账户:admin/admin # 61616 端口提供JMS服务 # 8161 端口提供管理控制台服务 # 查看activemq状态 service activemq status # 关闭activemq服务 service activemq stop 2. Java程序生成消息基本案例 2.1 JMS简介JMS 总体编码规范
JMS开发基本步骤
Destination
Destination 即目的地。下面拿 jvm 和 mq 做个对比,目的地可以理解为是数据存储的地方。
两种Destination
2.2 Idea新建Maven工程 <!-- activemq 所需要的jar包--> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.15.9</version> </dependency> <!-- activemq 和 spring 整合的基础包 --> <dependency> <groupId>org.apache.xbean</groupId> <artifactId>xbean-spring</artifactId> <version>3.16</version> </dependency> <!-- junit/log4j等基础配置 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependency> 2.3 队列消息(Queue)队列消息特点
点对点消息传递域的特点如下
每个消息只能有一个消费者,类似 1对1 的关系。
消息的生产者和消费者之间 没有时间上的相关性。无论消费者在生产者发送消息时是否处于运行状态,消费者都可以提取消息。如我们发送短信,发送者发送后接受者不一定会及收及看。
消息被消费后队列 不会再存储,所以消费者 不会消费到已经被消费过的消息。
队列消息生产者
public class JmsProduce { public static final String ACTIVEMQ_URL = "tcp://mpolaris.top:61616"; public static final String QUEUE_NAME = "queue_01"; public static void main(String[] args) throws JMSException { //1.创建连接工厂,按照给定的url地址,采用默认用户名和密码 ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); //2.通过连接工厂获得连接connection并启动访问 Connection conn = factory.createConnection(); conn.start(); //3.创建会话session // 两个参数:事务,签收 Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); //4.创建目的地(具体是队列queue还是主题topic) // Destination -> Queue/Topic Queue queue = session.createQueue(QUEUE_NAME); //5.创建消息的生产者 MessageProducer producer = session.createProducer(queue); //6.通过使用消息生产者发送三条消息到MQ队列中 for (int i = 0; i < 3; i++) { //创建消息 TextMessage textMessage = session.createTextMessage("msg -> " + i); //通过消息生产者发送给MQ producer.send(textMessage); } //7.关闭资源 producer.close(); session.close(); conn.close(); System.out.println("====> 消息发布到MQ完成"); } }