正确的方法在Apache QPID上为Azure Service Bus编写激活规格



我在开放的自由度中成功配置了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&amp;amqp.traceFrames=true&;jms.username=xxxx&amp;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?对此有任何评论吗?

最新更新