2015-11-06 90 views
0

我正在使用Glassfish和OpenMQ爲遠程使用者實例查找消息同步生成器的隊列和進程請求。JMS使用者使用Glassfish和OpenMQ同步接收來自遠程生產者的消息

根據McIntosh的回答Synchronous Consumer with JMS Queue, 可以通過調度來處理同步消息接收。我打算這樣做,但我只看到由驅動Bean(MDB)的異步消息的方式連接到一個消息隊列的示例中,如下面所示:

import javax.jms.MessageListener; 
import javax.annotation.Resource; 
import javax.ejb.ActivationConfigProperty; 
import javax.ejb.MessageDriven; 
import javax.ejb.MessageDrivenContext; 

@MessageDriven(activationConfig = { 
@ActivationConfigProperty(propertyName = "addressList", propertyValue = "mq://localhost:54020/"), //found in Producer server's domain.xml as JMS_PROVIDER_PORT 
@ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "jms/ProducerRequestMessageQueue"), 
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")}) 

public class ConsumerNode extends Node implements MessageListener { 

    @Resource 
    private MessageDrivenContext _mdc; 

    public ConsumerNode() { 
     super(); 
    } 

    @Override 
    public void onMessage(Message message) { 
     //process message... 
    } 
} 

如何連接到遠程生產者隊列沒有實施MessageListener並設置爲消息驅動Bean?

回答

0

終於明白了。我需要位於imq.jar MQ庫:

%GLASSFISH_HOME%/ MQ/lib中/

下面的代碼回答我的核心件作爲init()onMessage()方法問題:

import javax.annotation.PostConstruct; 
import javax.annotation.PreDestroy; 
import javax.ejb.Singleton; 
import javax.ejb.Schedule; 
import javax.jms.JMSException; 
import javax.jms.Message; 
import javax.jms.MessageConsumer; 
import javax.jms.Session; 
import javax.jms.ObjectMessage; 
import javax.jms.StreamMessage; 
import javax.jms.TextMessage; 
import javax.jms.Connection; 
import javax.jms.Queue; 

//from imq.jar 
import com.sun.messaging.ConnectionConfiguration; 
import com.sun.messaging.ConnectionFactory; 

@Singleton 
public class SyncNode { 
    private ConnectionFactory _producerRequestFactory; 
    private Connection _connection; 
    private Session _session; 
    private Queue _producerRequestMessageQueue; 
    private MessageConsumer _consumer; 

    @PostConstruct 
    void init() { 
     try { 
      _producerRequestFactory = new ConnectionFactory(); 
      _producerRequestFactory.setProperty(ConnectionConfiguration.imqBrokerHostName, "localhost"); 
      _producerRequestFactory.setProperty(ConnectionConfiguration.imqBrokerHostPort, "56527"); //56527 is JMS_PROVIDER_PORT found in producer's domain.xml in domain config directory 
      _connection = _producerRequestFactory.createConnection(); 
      _session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
      _producerRequestMessageQueue = _session.createQueue("ProducerRequestMessageQueue"); //name of the queue that the producer sends messages to. 
      _consumer = _session.createConsumer(_producerRequestMessageQueue); 
      _connection.start(); 
     } catch (JMSException ex) { 
      //handle exception 
     } 
    } 

    @PreDestroy 
    void cleanup() { 
     try { 
      _consumer.close(); 
      _session.close(); 
      _connection.close(); 
     } catch (JMSException ex) { 
      //handle exception 
     } 
    } 

    @Schedule(hour = "*", minute = "*", second = "*/10", persistent = false) 
    public void onMessage() { 
     try { 
      _connection.start(); 
      Message message = _consumer.receive(); 
      //handle message 
     } catch (JMSException ex) { 
      //handle exception 
     } 
    } 
} 

兩個代碼示例幫助我:

  1. This answer教會了我使用主要方法逃避適當的註釋。
  2. This tutorial幫助點擊如何連接到另一臺服務器,或端口在我的情況。
相關問題