当社の 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()
それともこれをカバーしますか?