我在开放的自由度中成功配置了Apache QPID JMS Client(0.41.0(,以将消息发送到Azure Service Bus Queue。
我的server.xml看起来像这样:
<jndiObjectFactory id="servicebusfactory" libraryRef="qpidlibsid"
className="org.apache.qpid.jms.jndi.JNDIReferenceFactory"
objectClassName="org.apache.qpid.jms.JmsConnectionFactory">
</jndiObjectFactory>
<jndiReferenceEntry id="qpidconnectionfactory"
jndiName="jms/ServiceBus"
factoryRef="servicebusfactory">
<properties remoteURI="amqps://xxx.servicebus.windows.net?amqp.idleTimeout=120000&amqp.traceFrames=true&;jms.username=xxxx&jms.password=xxx"/>
</jndiReferenceEntry>
<jndiObjectFactory id="queuefactory" libraryRef="qpidlibsid"
className="org.apache.qpid.jms.jndi.JNDIReferenceFactory"
objectClassName="org.apache.qpid.jms.JmsQueue">
</jndiObjectFactory>
<jndiReferenceEntry id="myqueue"
jndiName="jms/myqueue"
factoryRef="queuefactory">
<properties address="myqueue" />
</jndiReferenceEntry>
使用上述服务器配置我可以将消息发送到服务总线队列(使用JMS消息生产商(。
问题是使用消息驱动的bean接收消息。我尝试了此配置:
@MessageDriven(name = "processorMDB", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "jms/myqueue"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "connectionFactoryLookup", propertyValue = "jms/ServiceBus"),
})
开始开放自由时会受到警告:
[警告] CNTR4016W:由于无法使用JMS/Myqueue目标,因此无法激活ProcessOrMDB消息驱动的BEAN的消息端点。消息端点将在目标可用之前不会接收消息。
我需要某种激活规范,但是我无法使其正常工作。
对如何在开放自由中使用激活规范的帮助或解释!
您需要配置JMS激活规范是正确的。为此,您需要安装JMS资源适配器,该适配器需要JMS-2.0功能,
<featureManager>
<feature>jms-2.0</feature>
<feature>mdb-3.2</feature>
... other features
</featureManager>
<resourceAdapter id="myJMSResourceAdapter" location="C:/adapters/jmsRA.rar"/>
<jmsActivationSpec id="processorMDB">
<properties.myJMSResourceAdapter .../>
</jmsActivationSpec>
<jmsQueue jndiName="jms/myqueue">
<properties.myJMSResourceAdapter .../>
</jmsQueue>
我从未有过MDB工作。
我在JMSconsumer上使用了普通的MessageListener,即使Javadoc表示以下内容,它也可以很好地工作:
此方法不得在Java EE Web或EJB应用程序中使用。这样做可能会导致jmsruntimeException被抛弃,尽管不能保证这一点。
代码是:
@Singleton
@Startup
public class CreditProcessorBeanListener {
@Resource(name = "jms/ServiceBus")
private ConnectionFactory connectionFactory;
@Resource(name = "jms/myqueue")
private Queue myqueue;
private JMSContext context;
private JMSConsumer consumer;
@PostConstruct
private void init() {
initListener();
}
private void initListener() {
context = connectionFactory.createContext();
consumer = context.createConsumer(myqueue);
consumer.setMessageListener(new MyListener());
}
@PreDestroy
private void destroy() {
consumer.close();
context.close();
}
}
为什么MessageListener在JMSconsumer上使用Javaee中的JMSconsumer?对此有任何评论吗?