我有一种情况,现在我无法切换到Artemis。在跟进了几篇文章之后,我了解到ActiveMQ与JMS 2.0通信变得棘手。
由于Jolokia api(Is it possible to retrieve more than 400 messages from ActiveMQ queue via Jolokia API?)的某些限制,我按照注释中的建议切换到JMS API来浏览我的队列。当它作为独立应用程序运行时,它可以很好地工作并给出预期的结果,因为我已经将activemq-client作为依赖项之一包括在内:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
<version>5.12.1</version>
<type>jar</type>
</dependency>
我尝试通过创建如下连接工厂来在具有相同依赖性的Karaf中部署类似的实现:
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
"tcp://localhost:61616");
失败的原因是: 1. activemq-client需要JMS 1.x 2.我的karaf容器具有JMS 2.0
因此,我选择将javax.jms-api/2.0
的池化连接工厂用作osgi捆绑软件中的JMS api依赖项,如下所示:
例如我的蓝图配置; jms/consumer
在服务注册表中已经可用
<reference id="jmsConnectionFactory" interface="javax.jms.ConnectionFactory"
filter="(osgi.jndi.service.name=jms/consumer)" availability="mandatory" />
<dependency>
<groupId>javax.jms</groupId>
<artifactId>javax.jms-api</artifactId>
<version>2.0</version>
</dependency>
我在创建连接中的代码片段为:
brokerConnection = connectionFactory.createConnection();
session = this.createSession(brokerConnection);
brokerConnection.start();
直到这一点,brokerConnection和会话都不为空。
Queue queue = session.createQueue("test.queue");
queueBrowser = session.createBrowser(queue);
从这一点开始,我得到一个NullPointerException:
java.lang.NullPointerException
at org.apache.activemq.ActiveMQSession.createQueue(ActiveMQSession.java:1335)
at org.apache.activemq.jms.pool.PooledSession.createQueue(PooledSession.java:197)
at test.mbean.getBrokerEntries(BrokerMBean.java:142)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
at sun.reflect.GeneratedMethodAccessor27.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:112)
at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:46)
at com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(MBeanIntrospector.java:237)
at com.sun.jmx.mbeanserver.PerInterface.invoke(PerInterface.java:138)
at com.sun.jmx.mbeanserver.MBeanSupport.invoke(MBeanSupport.java:252)
at javax.management.StandardMBean.invoke(StandardMBean.java:405)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
at org.jolokia.handler.ExecHandler.doHandleRequest(ExecHandler.java:98)
at org.jolokia.handler.ExecHandler.doHandleRequest(ExecHandler.java:40)
at org.jolokia.handler.JsonRequestHandler.handleRequest(JsonRequestHandler.java:89)
at org.jolokia.backend.MBeanServerExecutorLocal.handleRequest(MBeanServerExecutorLocal.java:109)
at org.jolokia.backend.MBeanServerHandler.dispatchRequest(MBeanServerHandler.java:159)
at org.jolokia.backend.LocalRequestDispatcher.dispatchRequest(LocalRequestDispatcher.java:99)
...
我不确定这里出了什么问题。任何输入将非常有帮助。
谢谢。