ActiveMQ问题解决记录

问题4:Networks of Brokers
在每个activemq server的配置文件activemq.xml里加入如下内容,每个activemq server都需要设置内容相类型的multicase,如果activemq的连接设置了安全权限,则需要在networkConnector元素中加入userName password内容。
<transportConnectors>
       <transportConnector name="openfire" uri="tcp://localhost:61617" discoveryUri="multicast://openfire"/> 
    </transportConnectors>
    
    <networkConnectors>
      <!-- by default just auto discover the other brokers -->
      <networkConnector name="openfire" uri="multicast://openfire" userName="publisher" password="password" /> 
    </networkConnectors>


问题3:使用http协议
activeMQ的运行版本是4.0,调用activeMQ的jar包进行收发消息时,需要将activeMQ server目录里的commons-httpclient-2.0.1.jar、xstream-1.1.2.jar、xmlpull-1.1.3.4d_b4_min.jar拷贝到activeMQ jar使用者的classpath环境里。


问题2:Java与C#通过ActiveMQ进行消息交互
情景1:Java发送消息,C#接收消息; 情景2:C#发送消息,Java接收消息。

写C#的AMQ客户端时,需要引用到Apache.NMS-1.1.0-bin和Apache.NMS.ActiveMQ-1.1.0-bin这两个文件包中的dll文件(下载地址:http://archive.apache.org/dist/activemq/apache-nms/1.1.0/);将Apache.NMS.ActiveMQ-1.1.0-bin中的nmsprovider-activemq.config和nmsprovider-tcp.config这两个配置文件放入C#的AMQ客户端可执行路径中,使客户端可以找到AMQ这两个相关的配置信息文件。

Apache.NMS-1.1.0要求的org.apache.activemq.openwire.v*.MarshallerFactory版本是v2,该版本在incubator-activemq-4.0不存在,无法与他进行消息交互;在apache-activemq-4.1.2中存在,可以进行消息交互。

出现过的问题:
1)No IConnectionFactory implementation found for connection URI
未将nmsprovider-activemq.config和nmsprovider-tcp.config这两个配置文件放入C#的AMQ客户端可执行路径中。

2)java.lang.IllegalArgumentException: Invalid version: 6, could not load org.apache.activemq.openwire.v6.MarshallerFactory
Apache.NMS-1.1.0要求的org.apache.activemq.openwire.v*.MarshallerFactory版本与incubator-activemq-4.0中的该类的v*包版本不一致。

C#的AMQ客户端代码,参见附件:AMQ Client For C sharp.zip

问题1:topic receive: The subscription does not exist (activemq 4.0)
问题原因:同一个consumer的selector发生了变化,参见下面方法中的第84行至第95行。
org.apache.activemq.broker.region.TopicRegion.addConsumer(ConnectionContext context, ConsumerInfo info)

解决方案:在 AbstractRegion.removeConsumer 方法中增加null保护处理。
void org.apache.activemq.broker.region.AbstractRegion.removeConsumer(ConnectionContext context, ConsumerInfo info) throws Exception

public void removeConsumer(ConnectionContext context, ConsumerInfo info) throws Exception {
        
        Subscription sub = (Subscription) subscriptions.remove(info.getConsumerId());
//        if( sub==null )
//            throw new IllegalArgumentException("The subscription does not exist: "+info.getConsumerId());
        if (sub != null) {
	        // remove the subscription from all the matching queues.
	        for (Iterator iter = destinationMap.get(info.getDestination()).iterator(); iter.hasNext();) {
	            Destination dest = (Destination) iter.next();
	            dest.removeSubscription(context, sub);
	        }
	        
	        destroySubscription(sub);
        }
    }


topic subscriber的不同selector会影响到TopicViewMBean.getConsumerCount()的计数个数,具有不同selector的topic subscriber被认为是不同的consumer

原始错误信息(来自于activemq的输出信息):
INFO  Service                        - Sync error occurred: java.lang.IllegalArg
umentException: The subscription does not exist: OFFLINE:1:2
java.lang.IllegalArgumentException: The subscription does not exist: OFFLINE:1:2

        at org.apache.activemq.broker.region.AbstractRegion.removeConsumer(AbstractRegion.java:202)
        at org.apache.activemq.broker.region.TopicRegion.addConsumer(TopicRegion.java:92)
        at org.apache.activemq.broker.region.RegionBroker.addConsumer(RegionBroker.java:296)
        at org.apache.activemq.broker.BrokerFilter.addConsumer(BrokerFilter.java:73)
        at org.apache.activemq.advisory.AdvisoryBroker.addConsumer(AdvisoryBroker.java:77)
        at org.apache.activemq.broker.BrokerFilter.addConsumer(BrokerFilter.java:73)
        at org.apache.activemq.broker.BrokerFilter.addConsumer(BrokerFilter.java:73)
        
       ......
        

你可能感兴趣的:(activemq)