0

当社の DBA は、これらのキューを排出する Oracle AQ Java プロセスから作成された接続に起因する SQLNet ブレーク エラーが多数あることに気付きました。Java 側にエラーは見られず、それ以外の場合は問題なく動作しているようです。これらの中断を引き起こす可能性のあるアプローチについて何かありますか?

ここにDB側からのエラーがあります... Oracleバージョン11.2.0.3を使用

ORA 25228
25228, 00000, "timeout or end-of-fetch during message dequeue from %s.%s"
// *Cause: User-specified dequeue wait time has passed or the end of the
//         queue has been reached but no message has been retrieved.
// *Action: Try dequeue again with the appropriate WAIT_TIME or the
//          FIRST_MESSAGE option.

Java AQ接続/セッションを初期化する方法は次のとおりです...

private static Queue queue = null;

public void init() { 
  QueueConnectionFactory queueConnectionFactory = AQjmsFactory.getQueueConnectionFactory(server, schema,    1521, "thin");
  QueueConnection queueConnection = queueConnectionFactory.createQueueConnection(user, password);
  queueConnection.start();
  QueueSession queueSession = queueConnection.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE);
  queue = ((AQjmsSession )queueSession).getQueue(streamUser, streamQueue);
 }

次に、タイマー (15 秒ごと) を使用して、このブロックを定期的に呼び出してキューを空にします...

QueueReceiver qr = queueSession.createReceiver(queue);

while (true) {
  Message message = qr.receive(1000);
  if(message == null) {
    break;
  } else {
    //process the msg
    queueSession.commit();
  }
}

onMessage() 非同期コールバック アプローチの使用も検討しましたが、さまざまな理由からこのアプローチを優先しました...

質問1

これは Oracle の AQ ドキュメントで参照されている例であり、かなり単純なアプローチのように見えますが、Java でメッセージをデキューするより安定した方法はありますか?

質問2

また、CLIENT_ACK モードが原因である可能性があるかどうか疑問に思っています...明示的に呼び出すmessage.acknowledge()必要がありますか、queueSession.commit()それともこれをカバーしますか?

4

1 に答える 1

0

いくつかの調査の後、これは Oracle AQ のデキューのバグのように聞こえ、キューが空の場合は常にスローされます。

参照:

次のように、キャッチして無視する必要があります。

   ...
   EXCEPTION
      WHEN OTHERS
      THEN
         IF SQLCODE = -25228 /* Timeout; queue is likely empty... */
         THEN
            item := NULL;
         ELSE  
            RAISE;
         END IF;
于 2014-02-13T04:14:30.417 に答える