学习淘淘商城第五十六课(ActiveMQ发送queue消息)

来源:互联网 发布:下载淘宝游览器 编辑:程序博客网 时间:2024/05/29 00:34

      我们在taotao-manager和taotao-search工程都会用到消息服务,因此我们可以选择其中任何一个工程来进行测试,这里我们使用taotao-manager-service工程(taotao-manager的子工程)来测试一下面对面发送消息和接收消息。

      首先,我们需要在taotao-manager-service工程添加对activemq的maven依赖,如下图所示。activemq的版本号在taotao-parent工程已经统一定义好了,我们使用的是5.11.2版本的Jar包,之所以选择这个版本的Jar包,是因为这个版本的Jar包还没有spring相关的包结构,与spring结合不会有问题,我们安装的activemq服务是5.12.0版本的,它里面的Jar包是有spring相关的Jar包的,这样会引起Jar包冲突,出现各种各样的问题,因此我们虽然安装的是5.12.0版本的activemq,但是我们使用的Jar包却是5.11.2版本。


      下面我们在taotao-manager-service工程新建一个测试包和测试类,如下图所示。


        测试类代码如下:

package com.taotao.activemq;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.JMSException;import javax.jms.MessageProducer;import javax.jms.Queue;import javax.jms.Session;import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnectionFactory;import org.junit.Test;public class TestActiveMq {  @Testpublic void testQueueProducer() throws JMSException{//1.创建一个连接工厂对象ConnectionFactory对象。需要指定mq服务的ip及端口号。注意参数brokerURL的开头是//tcp://而不是我们通常的http://,端口是61616而不是我们访问activemq后台管理页面所使用的8161ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.156.30:61616");//2.使用ConnectionFactory创建一个连接Connection对象Connection connection = connectionFactory.createConnection();//3.开启连接。调用Connection对象的start方法connection.start();//4.使用Connection对象创建一个Session对象//第一个参数是是否开启事务,一般不使用分布式事务,因为它特别消耗性能,而且顾客体验特别差,现在互联网的//做法是保证数据的最终一致(也就是允许暂时数据不一致),比如顾客下单购买东西,一旦订单生成完就立刻响应给用户//下单成功。至于下单后一系列的操作,比如通知会计记账、通知物流发货、商品数量同步等等都先不用管,只需要//发送一条消息到消息队列,消息队列来告知各模块进行相应的操作,一次告知不行就两次,直到完成所有相关操作为止,这//也就做到了数据的最终一致性。如果第一个参数为true,那么第二个参数将会被忽略掉。如果第一个参数为false,那么//第二个参数为消息的应答模式,常见的有手动和自动两种模式,我们一般使用自动模式。Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//5.使用Session对象创建一个Destination对象,两种形式queue、topic。现在我们使用queue//参数就是消息队列的名称Queue queue = session.createQueue("test-queue");//6.使用Session对象创建一个Producer对象MessageProducer producer = session.createProducer(queue);//7.创建一个TextMessage对象//有两种方式,第一种方式://TextMessage textMessage = new ActiveMQTextMessage();//textMessage.setText("hello,activemq!!!");//第二种方式:TextMessage textMessage = session.createTextMessage("hello,activemq!!");//8.发送消息producer.send(textMessage);//9.关闭资源producer.close();session.close();connection.close();}}

      我们运行上面的测试方法,执行成功后,我们到activemq的后台管理系统,点击"Queues",可以看到我们刚才发送的那条消息"test-queue"。我们点击"test-queue"


       我们会看到如下图所示界面,可以看到刚才发送的那条消息的ID信息,Persistence(持久化)为永久保存,Priorty(优先级)为4,Redelivered(是否重复投递消息)为false,即不重复投递消息。我们点击ID那一长串字符串。


      可能会看到如下图所示的错误


          我们找到日志文件activemq.log,如下图所示。


        查看activemq.log文件,可以看到错误信息如下所示:

PWC6197: An error occurred at line: 20 in the jsp file: /WEB-INF/tags/form/forEachMapEntry.tagPWC6199: Generated servlet error:The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class filesat org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:123)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:296)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:376)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.Compiler.compile(Compiler.java:437)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:608)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.servlet.JspServletWrapper.loadTagFile(JspServletWrapper.java:261)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.TagFileProcessor.loadTagFile(TagFileProcessor.java:683)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.TagFileProcessor.access$000(TagFileProcessor.java:88)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.TagFileProcessor$TagFileLoaderVisitor.visit(TagFileProcessor.java:739)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1501)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2291)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2341)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.TagFileProcessor$TagFileLoaderVisitor.visit(TagFileProcessor.java:743)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1501)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2291)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2341)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.TagFileProcessor$TagFileLoaderVisitor.visit(TagFileProcessor.java:743)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1501)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2291)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2341)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2347)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.Node$Root.accept(Node.java:498)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2291)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.TagFileProcessor.loadTagFiles(TagFileProcessor.java:757)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:222)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.compiler.Compiler.compile(Compiler.java:435)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:608)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:360)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:486)[jsp-2.1-glassfish-2.1.v20100127.jar:]at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:380)[jsp-2.1-glassfish-2.1.v20100127.jar:]at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)[geronimo-servlet_3.0_spec-1.0.jar:1.0]at org.eclipse.jetty.servlet.JspPropertyGroupServlet.service(JspPropertyGroupServlet.java:132)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)[spring-web-3.2.11.RELEASE.jar:3.2.11.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)[spring-web-3.2.11.RELEASE.jar:3.2.11.RELEASE]at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1484)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.apache.activemq.web.SessionFilter.doFilter(SessionFilter.java:45)[activemq-web-5.12.0.jar:5.12.0]at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1484)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.apache.activemq.web.filter.ApplicationContextFilter.doFilter(ApplicationContextFilter.java:102)[file:/usr/local/apache-activemq-5.12.0/webapps/admin/WEB-INF/classes/:]at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1476)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:522)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:522)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.server.Server.handle(Server.java:370)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903]at java.lang.Thread.run(Thread.java:745)[:1.8.0_112][root@activemq data]#  

         出现上面的错误是由于我们安装的activemq不支持JDK1.8造成的,而我安装的虚拟机使用的JDK就是1.8的,因此才会造成这个错误,要解决这个问题也比较简单,就是在activemq这台虚拟机上把JDK1.8换成JDK1.7就可以了。jdk1.7版本的linux安装包大家可以到http://download.csdn.net/detail/u012453843/9807358这个地址进行下载。下载完后上传到activemq服务器上进行安装,安装完后,需要修改下/etc/profile这个文件当中配置的全局jdk地址,将原来jdk1.8改成1.7的,如下所示。

export JAVA_HOME=/usr/local/jdk1.7.0_80export PATH=$PATH:$JAVA_HOME/bin

        修改完/etc/profile后,使用命令source /etc/profile来使刚才的配置生效,但我发现直接换成1.7后,使用java -version命令看到的还是jdk1.8,于是我们重启这台虚拟机,重启之后,jdk变成1.7版本了,如下所示。

[root@activemq ~]# java -versionjava version "1.7.0_80"Java(TM) SE Runtime Environment (build 1.7.0_80-b15)Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)[root@activemq ~]#
       由于重启了虚拟机,我们需要重新启动activemq,到/usr/local/apache-activemq-5.12.0/bin目录下进行启动,如下所示。

[root@activemq bin]# ./activemq startINFO: Loading '/usr/local/apache-activemq-5.12.0//bin/env'INFO: Using java '/usr/local/jdk1.7.0_80/bin/java'INFO: Starting - inspect logfiles specified in logging.properties and log4j.properties to get detailsINFO: pidfile created : '/usr/local/apache-activemq-5.12.0//data/activemq.pid' (pid '1423')[root@activemq bin]# 
      重启activemq之后,我们再刷新刚才出现问题的界面,发现这时可以正常访问了,我们在"Message Details"一栏,可以看到我们发送的消息信息。



         

       

1 0