1

我想將日誌/審計事件發佈到JMS隊列服務器。我實現了構造消息的「QueueConnectActor」,使用下面的代碼創建隊列併發送消息。非阻塞Jms隊列發件人

這會阻止對JMS的調用。我想知道是否有更好的非嵌套方式將消息發送到隊列?換句話說,任何參考/指針或示例代碼爲jms客戶端上playframework。

QueueConnectionFactory factory = new com.tibco.tibjms.TibjmsQueueConnectionFactory(serverUrl); 
    QueueConnection connection = factory.createQueueConnection(userName,password); 
    QueueSession session = connection.createQueueSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE); 

    javax.jms.Queue queue = session.createQueue(queueName); 
    QueueSender sender = session.createSender(queue);   

    javax.jms.TextMessage textMessage = session.createTextMessage(); 
    textMessage.setText(eventXml); 
    sender.send(textMessage); 

    connection.close(); 

謝謝!

回答

2

JMS 1.1規範沒有指定用於非阻塞發送調用的API或選項。因此,JMS實現將不具有非阻塞即異步發送功能。然而,像WebSphere MQ這樣的JMS實現具有使用非阻塞發送調用發送消息的提供程序特定選項。 (請參閱下面的示例代碼)

最近(大約一年左右),JMS 2.0規範添加了一種新的方法,允許應用程序異步發送消息。

下面的示例代碼演示了使用WebSphere MQ進行異步發送。

connection = cf.createConnection(); 
    session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
    destination = session.createQueue("queue:///Q1"); 

    // Request asynchronous sends to this destination. Note: Message will be 
    // sent asynchronously if the environment permits; otherwise, message will 
    // be sent synchronously. See documentation for further details. 
    ((JmsDestination) destination).setIntProperty(WMQConstants.WMQ_PUT_ASYNC_ALLOWED, 
     WMQConstants.WMQ_PUT_ASYNC_ALLOWED_ENABLED); 

    producer = session.createProducer(destination); 

    long uniqueNumber = System.currentTimeMillis() % 1000; 
    TextMessage message = session 
     .createTextMessage("SimpleAsyncPutPTP: Your lucky number today is " + uniqueNumber); 

    // Start the connection 
    connection.start(); 

    // And, send the message 
    producer.send(message); 
    System.out.println("Sent message:\n" + message); 
+0

感謝您的澄清! – user1557197

+0

如果您對我的回答感到滿意,請投票:) – Shashi

+0

您使用的是哪個版本的Websphere MQ? WMQConstants.WMQ_PUT_ASYNC_ALLOWED_ENABLED在7.0.x中不存在 –