搞定JAVA消息队列,看我用了几步

转自:from http://www.jianshu.com/p/942925f36490

近期公司项目中,听同事提起MQ、JMS,因为之前没有使用过不太了解,所以抽出半天时间学习下,了解下相关概念、功能及其用途。便于再次与人沟通时可以言之有物,后续工作中遇到了,可立马上手,提高工作效率。

学习过程分为三个步骤:

  • 1 查找资料
  • 2 实验实践
  • 3 归纳总结

学习思路.jpg

2

查找资料

推荐两篇博客,内容不错。

  • JMS(Java消息服务)入门教程 ,比较适合了解基本知识,包括概念、分类、用途及其原理。
  • 消息队列MQ技术的介绍和原理,介绍了消息队列MQ的基本知识点。 此处不再对技术内容进行复制粘贴,仅提供学习思路。首先用what、how、why提出自己心中感兴趣的几个问题,然后在到资料中找出想要的答案。例如:什么是Java消息服务?MQ? 为什么要有消息服务?优点是什么?消息服务是如何实现的? JSM Java Message Service, MQ Message Queue

3

实验

为了验证activeMQ跨服务器传递消息,我验证了单机部署,也验证了三机部署 172.16.2.121 activeMQ http://172.16.2.121:8161/ 172.16.2.126 生产者 http://172.16.2.126:9080/JMSProject 172.16.2.184 消费者 http://172.16.2.184:9080/JMSProject/Receive

通过上面的快速阅读和详细阅读之后,已经在概念上了解了,下面通过一个实验对概念和原理进行深入的理解,了解其用途及其适用范围。

  • 1 环境介绍 apache-tomcat-7.0.61、apache-activemq-5.6.0、eclipse neon、jdk 1.8.0 ;
  • 2 实验代码工程链接地址 https://github.com/abshawn/JMSProject ,可以从此处下载代码,在本地部署查看效果。项目中的context.xml,需要更新到tomcat的conf/context.xml中。否则会提示以下两个问题
    2.1) javax.naming.NameNotFoundException: Name [queue/queue0] is not bound in this Context. Unable to find [queue].
    这个错误的原因是未在tomcat/conf/context.xml中配置以下代码:
    <Resource auth="Container" brokerName="LocalActiveMQBroker" brokerURL="tcp://172.16.2.121:61616" description="JMS Connection Factory" factory="org.apache.activemq.jndi.JNDIReferenceFactory" name="queue/connectionFactory" type="org.apache.activemq.ActiveMQConnectionFactory"/> 
    <Resource auth="Container" description="My Queue" factory="org.apache.activemq.jndi.JNDIReferenceFactory" name="queue/queue0" physicalName="TomcatQueue" type="org.apache.activemq.command.ActiveMQQueue"/>
    
    2.2) javax.jms.JMSException: Could not connect to broker URL: tcp://172.16.2.121:61616. Reason: java.net.ConnectException: Connection refused: connect
    Caused by: java.net.ConnectException: Connection refused: connect
    这个保存可能是因为为安装activeMQ或安装完未启动(可参考activeMQ安装启动教程

     
  • 3 实验效果截图通过activemq可以监控到消息队列的内容。

    ActiveMQ.jpg

消息生产者.jpg
 

发送消息时,后台打出这个log,则需要在/etc/hosts中增加hostname 
127.0.0.1 CentOS65M1

javax.jms.JMSException: Could not connect to broker URL: tcp://172.16.2.121:61616. Reason: java.net.UnknownHostException: CentOS65M1: CentOS65M1: 未知的名称或服务
        at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:35)
        at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:280)
        at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:224)
        at org.apache.activemq.ActiveMQConnectionFactory.createQueueConnection(ActiveMQConnectionFactory.java:187)
        at com.jd.zn.message.jms.Send.doGet(Send.java:57)
        at com.jd.zn.message.jms.Send.doPost(Send.java:106)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)


消息消费者.jpg

4

归纳总结

JMS “ 一个中心,两种模式,三步实现”

  • 1 以 消息服务器为中心消息生产者 通过客户端发消息给消息服务器; 消息消费者通过消息服务器接收消息;
  • 2 两种消息发送模型两种消息发送模型规范:点对点、发布订阅 ;
  • 3 实现方法分为三步 3.1、 统一消息服务器,建立连接Connections ; 3.2 、通过连接建立队列会话session; 3.3 、准备就绪后,执行 生产者 发消息和消费者 接消息(异步)。

优点 解耦合、异步

作者:和奇谷朴链接:http://www.jianshu.com/p/942925f36490來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/hemeinvyiqiluoben/article/details/81807642