Java ActiveMQ Artemis和5.x侦听器同时使用-NullPointerException

Java ActiveMQ Artemis和5.x侦听器同时使用-NullPointerException,java,activemq,spring-jms,activemq-artemis,Java,Activemq,Spring Jms,Activemq Artemis,我有一个传统的Spring 4.2.1.RELEASE应用程序,它作为侦听器连接到ActiveMQ 5.x,现在我们正在为ActiveMQ Artemis添加连接。对于Artemis,我们使用持久订阅是因为我们不希望订阅服务器宕机时主题上的消息丢失,而共享订阅是因为我们希望集群或使用并发来异步处理订阅中的消息。我有单独的ConnectionFactorys和ListenerContainers,但从不断重复的WARN日志来看,由于以下NPE,Artemis DMLC似乎无法启动: java.la

我有一个传统的Spring 4.2.1.RELEASE应用程序,它作为侦听器连接到ActiveMQ 5.x,现在我们正在为ActiveMQ Artemis添加连接。对于Artemis,我们使用持久订阅是因为我们不希望订阅服务器宕机时主题上的消息丢失,而共享订阅是因为我们希望集群或使用并发来异步处理订阅中的消息。我有单独的
ConnectionFactory
s和
ListenerContainer
s,但从不断重复的
WARN
日志来看,由于以下NPE,Artemis DMLC似乎无法启动:

java.lang.NullPointerException
    at org.springframework.jms.listener.AbstractMessageListenerContainer.createConsumer(AbstractMessageListenerContainer.java:856)
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.createListenerConsumer(AbstractPollingMessageListenerContainer.java:213)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.initResourcesIfNecessary(DefaultMessageListenerContainer.java:1173)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1149)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1142)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1039)
    at java.lang.Thread.run(Unknown Source)
表面上看,它似乎找不到方法
createSharedDurableConsumer
。查看I have,第856行正在调用method.invoke

/**JMS 2.0 Session.createSharedDurableConsumer方法(如果可用)*/
私有静态最终方法CreateShareDdurableCummerMethod=ClassUtils.GetMethodiAvailable(
Session.class,“createSharedDurableConsumer”,Topic.class,String.class,String.class);
...
方法方法=(isSubscriptionDurable()?
createSharedDurableConsumerMethod:createSharedConsumerMethod);
试一试{
return(MessageConsumer)方法。invoke(会话、目标、getSubscriptionName()、getMessageSelector());
}
Artemis配置:

@配置
公开课{
@自动连线
私人环境署;
@豆子
公共连接工厂ArtemonConnectionFactory(){
ActiveMQConnectionFactory ArtemiconConnectionFactory=ActiveMQJMSClient
.createConnectionFactoryWithHA(JMSFactoryType.CF,createTransportConfigurations());
ArtemiconFactory.setUser(env.getRequiredProperty(“artemis.username”);
ArtemiconConnectionFactory.setPassword(env.getRequiredProperty(“artemis.password”);
setCallTimeout(env.getRequiredProperty(“artemis.call.timeout.millis”,Long.class));
setConnectionTL(env.getRequiredProperty(“artemis.connection.ttl.millis”,Long.class));
连接工厂
.setCallFailoverTimeout(env.getRequiredProperty(“artemis.call.failover.timeout.millis”,Long.class));
ArtemiconConnectionFactory.setInitialConnectAttempts(
env.getRequiredProperty(“artemis.connection.truments.initial”,Integer.class));
连接工厂
.setReconnectAttempts(env.getRequiredProperty(“artemis.connection.attempts.reconnect”,Integer.class));
ArtemiconConnectionFactory.setRetryInterval(env.getRequiredProperty(“artemis.retry.interval.millis”,Long.class));
连接工厂
.setRetryIntervalMultiplier(env.getRequiredProperty(“artemis.retry.interval.multiplier”,Double.class));
ArtemiconConnectionFactory.setBlockOnAcknowledge(true);
ArtemiconConnectionFactory.setBlockOnDurableSend(true);
ArtemiconConnectionFactory.setCacheDestinations(true);
ArtemiconConnectionFactory.setConsumerWindowSize(0);
ArtemiconConnectionFactory.setMinLargeMessageSize(1024*1024);
CachingConnectionFactory CachingConnectionFactory=新的CachingConnectionFactory(ArtemicConnectionFactory);
卡钦连接厂
.setSessionCacheSize(env.getRequiredProperty(“artemis.session.cache.size”,Integer.class));
cachingConnectionFactory.setReconnectionException(true);
返回cachingConnectionFactory;
}
@豆子
公共默认jmsListenerContainerFactory ArtemicContainerFactory(连接工厂ArtemicConnectionFactory,
JmsTransactionManager artemisJmsTransactionManager,
映射Jackson2MessageConverter映射Jackson2MessageConverter){
DefaultJmsListenerContainerFactory=新的DefaultJmsListenerContainerFactory();
setCacheLevel(DefaultMessageListenerContainer.CACHE\u CONSUMER);
工厂。设置连接工厂(ArteConnectionFactory);
setDestinationResolver(新的DynamicDestinationResolver());
factory.setMessageConverter(映射Jackson2MessageConverter);
setSubscriptionDurable(Boolean.TRUE);
factory.setSubscriptionShared(Boolean.TRUE);
factory.setSessionAcknowledgeMode(已处理会话.Session_);
factory.SetSessionTransactived(布尔值.TRUE);
factory.setTransactionManager(artemisJmsTransactionManager);
返回工厂;
}
私有传输配置[]createTransportConfigurations(){
字符串connectorFactoryFqcn=NettyConnectorFactory.class.getName();
Map primaryTransportParameters=新的HashMap(2,1F);
字符串primaryHostname=env.getRequiredProperty(“artemis.primary.hostname”);
整数primaryPort=env.getRequiredProperty(“artemis.primary.port”,Integer.class);
primaryTransportParameters.put(“主机”,primaryHostname);
primaryTransportParameters.put(“端口”,primaryPort);
返回新的TransportConfiguration[]{
新的传输配置(connectorFactoryFqcn、primaryTransportParameters),
新的传输配置(connectorFactoryFqcn,backupTransportParameters)};
}
}
我的pom使用Artemis的2.10.0版


如何修复此问题?

JMS 2.0规范与JMS 1.1向后兼容,因此请确保您的类路径上只有JMS 2规范。我的直觉是,Spring代码中的反射调用变得混乱,因为它们命中的是JMS 1.1规范类,而不是正确的JMS 2规范类。

JMS 2.0规范与JMS 1.1向后兼容,因此请确保类路径上只有JMS 2规范。我的直觉是,Spring代码中的反射调用正在变得混乱,因为它们使用的是JMS 1.1规范类,而不是正确的JMS 2规范类