2014-02-27 81 views
1

我創建了一個連接到WebLogic隊列的同步QueueReceiver。QueueReceiver receive()沒有收到消息

doStuff() { 
    ctx = new InitialContext(); 
    qconFactory = (QueueConnectionFactory) ctx.lookup(CONNECTION_FACTORY); 
    queue = (Queue) ctx.lookup(outputFromOrcSyncQueue); 
    queueConnection = qconFactory.createQueueConnection(); 
    queueSession = queueConnection.createQueueSession(true, -1); 
    queueReceiver = queueSession.createReceiver(queue); 
    Message message = queueReceiver.receive(); 
    ... 
} 

在QueueSession的創作true這是因爲連接工廠進行交易。 如果我創建了一個沒有事務的queueSession(通過放false),結果是queueReceiver似乎忽略了使用doStuff方法的方法(使用receive(timeout)的相同行爲,它在等待之前不會等待)。

我還必須在我的連接工廠(WebLogic連接工廠配置中的客戶端選項卡)上啓用Prefetch Mode for Synchronous Consumer

我的問題是接收器沒有讀取任何發送到隊列的消息。

我可以在WebLogic控制檯上看到我的消息,我甚至可以看到我的queueReceiver在隊列中偵聽,但queueReceiver似乎忽略它們。

替代方法我試過:

  • 更改ACK類型的QueueSession創建(兩面,生產者和消費者)
  • 提交關於生產者會議send()後和前close()

謝謝。

回答

4

你忘了呼籲QueueConnectionstart方法:在Java EE教程

queueConnection = qconFactory.createQueueConnection(); 
queueConnection.start(); 
queueSession = queueConnection.createQueueSession(true, -1); 

由於The JMS API Programming Model幫忙,說:

在應用程序能夠使用消息,則必須調用該連接的start方法。

JMS Message Consumers部,也更加清晰:

永遠記住調用start方法;忘記開始連接是最常見的JMS編程錯誤之一。

+0

它的工作就像一個魅力!謝謝你達尼洛。 – seph