AMQ常见问题分析:
消息能够发送,但是收不到?
由于现在ActiveMQ配置的是集群模式, 分析生产者(produce)日志查看当前连接的是哪台ActiveMQ服务器?
查看自已创建的topic名称是什么?
查看调用方法,如果使用publish(String topic, MqEventBean eventBean),则第一参数为topic的名称,如果使用publish(MqEventBean eventBean),则topic名称是在Header(eventBean.setHeadValue(MqConstants.HEAD_EVENT_TOPIC, topic))中指定的。没有指定header。则默认的topic名称为【app-*】。
登录ActiveMQ的console(Http://ActiveMQ的服务器IP:8161/),使用admin/admin用户登录,查看创建的 Queue是否存在。点击Queue名字。查看消息的个数是否增加。(如果Queue size个数增加或者Enqueue size个数增加,表示生产者发布消息没问题。)【如果不知道生产者连接的是那台ActiveMQ服务器,你可以把所有ActiveMQ控制台都打开】<br /> <br />控制台如下:<br />
- 点击”ActiveMQ“。可以展示出当前存在的Queue和Topic
简单介绍:
Queue表示队列,一般适用于点对点的情况下,一个人发一个收。如果这个Queue被多个消费者监听。某一个消费者消费掉之后,其他的消费者不会拿到消息。
Topic表示广播,一般适用于点对多的情况下,一个人发多个收。
选择”Queue”。查看自已发布的topic名字在列表中是否存在。(如果知道生产者【produce】是连接那台ActiveMQ,只查看一台即可。如果不知道,则需要查看所有的集群的ActiveMQ控制台)
如果存在,表示生产者发布queue成功。检查一下正在队列中的数量是否增加。(是否增加是保证没有consumer的情况下。如果你都存在消费者,你刚publish的消息也许立马就被其他的消费者消费掉了。)
使用consumer的receive方法,监听指定的topic。当有消息进入的时候,会执行com.ibm.mq.api.MqConsumerService的exec方法。
如果执行这个方法。证明消费者能够正常消费。
考察点:
1.怎么查看当前队列中有多少个消息?
查看当前队列中还有多少消息?
方法1:Enqueue count 减去 Dequeue count
方法2:Queue size
2.接受的时候没有收到消息
检查订阅的topic是否跟发布者的一致。
查看console里面Queue是否有多个人在消费。如果有多个人在消费,可能消息已经被其他的消费者已经消费了。(保证只有一个人在消费Queue。)
是否提前预声明。
如果代码中出现这种异常
如果本地测试可以通过:System.setProperty(“org.apache.activemq.SERIALIZABLE_PACKAGES”,”*”);
dubbo服务部署需要添加:<br /> -Dorg.apache.activemq.SERIALIZABLE_PACKAGES=*<br /> tomcat部署需要在catalina.sh添加如下内容:<br /> JAVA_OPTS="$JAVA_OPTS -Dorg.apache.activemq.SERIALIZABLE_PACKAGES=*".
INFO: Loading '/opt/activemq/bin/env'
INFO: Using java '/opt/jdk/bin/java'
INFO: Starting in foreground, this is just for debugging purposes (stop process by pressing CTRL+C)
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000d0350000, 715849728, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 715849728 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /opt/activemq/bin/hs_err_pid3332.log
解决办法:export ACTIVEMQ_OPTS=”-Xmx256M -Xms128M”
-Xms1G -Xmx1G
javax.jms.JMSException: Failed to build body from content. Serializable class not available to broker. Reason: java.lang.ClassNotFoundException: Forbidden class com.ibm.mq.api.MqEventBean! This class is not allowed to be serialized. Add package with ‘org.apache.activemq.SERIALIZABLE_PACKAGES’ system property.
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:36)
at org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:193)
如果本地测试可以通过:System.setProperty(“org.apache.activemq.SERIALIZABLE_PACKAGES”,”“);
dubbo服务部署需要添加:
-Dorg.apache.activemq.SERIALIZABLE_PACKAGES=
tomcat部署需要在catalina.sh添加如下内容:
JAVA_OPTS=”$JAVA_OPTS -Dorg.apache.activemq.SERIALIZABLE_PACKAGES=*”
检查AMQ问题:
1.执行生产者produce代码,看Queue/Topic是否发布成功。
2.检查AMQ默认的控制台,查看消息是否存在。并且条数是否增加。
3.如果消息发布成功,调用消费者的代码。看是否可以打印一些消费信息。基本日志。
核心点:
1.生产者和消费者的topic名字是否一致。
2.控制台上面的消息是否增加或者消费。