activemq 发送消息,本地测试可以,放到服务器上之后报错,求大虾帮助。。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了activemq 发送消息,本地测试可以,放到服务器上之后报错,求大虾帮助。。相关的知识,希望对你有一定的参考价值。

javax.jms.JMSException: Cannot send, channel has already failed: tcp://10.30.174.19:1883
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:62)
at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1395)
at org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1481)
at org.apache.activemq.ActiveMQConnection.start(ActiveMQConnection.java:516)
at com.inspur.forword.mq.Subscriber.sendMessage(Subscriber.java:27)
at com.inspur.forword.webservice.impl.EOMSForwordServiceImpl.forwordService(EOMSForwordServiceImpl.java:78)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at com.sun.xml.internal.ws.api.server.InstanceResolver$1.invoke(InstanceResolver.java:235)
at com.sun.xml.internal.ws.server.InvokerTube$2.invoke(InvokerTube.java:135)
at com.sun.xml.internal.ws.server.sei.EndpointMethodHandler.invoke(EndpointMethodHandler.java:246)
at com.sun.xml.internal.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:82)
at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:587)
at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:546)
at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:531)
at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:428)

你先测试下端口是否被占用了!
没有在官方的faq上找到你这种情况,莫非你这种情况很少出现???
既然连接不到10.30.174.19 ,那你就ping一下服务器,看看是否能联通;然后在查看端口是否被占用!
在这里把官方的faq的errors发给你,你自己看一下吧!
http://activemq.apache.org/errors.html追问

activemq服务是启动着的。而且之前是可以访问的。
如果mq的消息队列中消息非常多,但是没有被消息队列移除,是不是会发生阻塞之类的问题?

参考技术A 你监听的端口不对,tcp监听端口应该为61616

敲重点啦!| Jmeter测试ActiveMQ服务


敲重点啦!| Jmeter测试ActiveMQ服务
JMS(java Message Service):即 Java 消息服务器应用程序接口,是一个 Java 平台中关于面向消息中间件(MOM)的 API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对 jms提供支持。它是Java平台上有关面向消息中间件(MOM)的技术规范,它便于消息系统中的Java 应用程序进行消息交换,并且通过提供标准的产生,发送,接受消息的接口简化企业应用的开发。
也就是:JMS是一个标准或者是一个协议,通常用于企业应用的消息传递。
如图就是 JMS Point-to-Point 的模型:

敲重点啦!| Jmeter测试ActiveMQ服务

发送者和接受者:

接受者从队列中获取消息,在成功接收消息之后需向队列应答成功。发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,都不会影响消息被发送到队列。

消息队列:

每个消息都被发送到一个特定的队列。队列保留着消息,直到他们被消费或超时。每个消息只有一个消费者,一旦被消费,消息就不在消息队列中了。

敲重点啦!| Jmeter测试ActiveMQ服务
它是Apache出品,最流行,能力最强劲的开源消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者。 

 ActiveMQ是通过什么工作模式来进行的?如图:

敲重点啦!| Jmeter测试ActiveMQ服务

ActiveMQ 工作模式中的部分解释如下:
ActiveMQ客户端使用 Connection Factory 对象创建一个连接,向消息服务发送消息以及从消息服务接收消息均是通过此连接来进行。
Connection是客户端与消息服务的活动连接。 这是一个相当重要的对象,大多数客户端均使用一个连接来进行所有的消息传送。
Session是用于生产和使用消息的单线程上下文。 它用于创建发送和生产者和接收消息的消费者,并为所发送的消息定义发送顺序。

客户端使用Message Product想指定的物理目标发送消息,客户端使用Message Consumer对象从指定的物理目标接收消息。消费者可以支持同步或异步消息接收。异步使用可通过向消费者注册 MessageListener 来实现。


敲重点啦!| Jmeter测试ActiveMQ服务
1、创建 jndi.properties 文件
jmeter是通过jndi来获得jms中相关对象的,如ConnectionFactory和Destination,所以要在jmeter的bin目录中添加一个jndi.properties属性文件,用于配置jndi

敲重点啦!| Jmeter测试ActiveMQ服务

2、把jndi.properties放到jmeter的启动jar包中
可以直接将jndi.properties文件拖入jar包中;打开命令行窗口,并定位到 JMETER_HOME/bin 目录,运 行如下命令 :
敲重点啦!| Jmeter测试ActiveMQ服务

3、添加activemq-all-5.2.0.jar包到Jmeter的lib库

将ACTIVE_HOME/activemq-all-5.2.0.jar文件复制到JMETER_HOME/lib目录中,jmeter在测试jms的时候会使用到activemq提供的jms的实现类,这些类并没有随jmeter一起分发,需要把这些类添加到jmeter的lib目录中。

4、启动 ActionMQ 服务
启动之后,在浏览器访问url:http://127.0.0.1:6161/admin,默认用户名和密码:admin

5、启动 jmeter添加线程组及JMS的 sampler,有三种方式的JMS消息
在jmeter的Sampler下面新建JMS Point-to-Point,信息如下:

○ QueueuConnectionFactory:MQ 连接工厂,此处填写:ConnectionFactory

○ JNDI name Request queue: 请求队列,输入配置文件的 MyQueuePertest 

○ JNDI name Receive queue: 接收队列名,输入配置文件的 MyQueuePertest 

○ Communiction Style: Request Only 

○ Content: 消息内容,此处填写:jmeter jms point to point,pertest

○ Initial Context Factory: 输入配置文件的 org.apache.activemq.jndi.ActiveMQInitialContextFactory

○ JNDI Properties: org.apache.activemq.jndi.ActiveMQInitialContextFactory 

○ Provider URL:ActionMQ 地址和端口
如图:
敲重点啦!| Jmeter测试ActiveMQ服务
查看结果:
敲重点啦!| Jmeter测试ActiveMQ服务

敲重点啦!| Jmeter测试ActiveMQ服务

测试JMS的PUB/SUB模型

需要新建立消费者模型,新建取样器:JMS Subscriber
●信息如下

initial Context Factory: org.apache.activemq.jndi.ActiveMQInitialContextFactory 

ConnectionFactory:MQ 连接工厂,此处填写:ConnectionFactory

Provider URL:tcp://127.0.0.1:61616

Destination:MyTopicPertest

Text Message:This is test jms publisher
启动该线程

查看发送者

敲重点啦!| Jmeter测试ActiveMQ服务

消费者
敲重点啦!| Jmeter测试ActiveMQ服务

说明:本文为柠檬班库里老师原创,转载需注明出处



敲重点啦!| Jmeter测试ActiveMQ服务
获取Jmeter相关视频资料

敲重点啦!| Jmeter测试ActiveMQ服务

敲重点啦!| Jmeter测试ActiveMQ服务

可加多多老师微信

13327216354


或者扫描下方二维码

敲重点啦!| Jmeter测试ActiveMQ服务

敲重点啦!| Jmeter测试ActiveMQ服务


我就知道你「在看」

以上是关于activemq 发送消息,本地测试可以,放到服务器上之后报错,求大虾帮助。。的主要内容,如果未能解决你的问题,请参考以下文章

ActiveMQ工作原理

Jmeter测试ActiveMQ服务

敲重点啦!| Jmeter测试ActiveMQ服务

JMS学习五(ActiveMQ的本地事务)

ActiveMQ持久化方式(转)

ActiveMQ的消息持久化机制