DBA는 이러한 대기열을 소진시키는 Oracle AQ Java 프로세스의 연결로 인해 많은 SQLNet 중단 오류를 발견했습니다. 자바 측에서 어떤 에러도 보이지 않는다. 그렇지 않으면 잘 작동하는 것처럼 보인다. 이러한 휴식의 원인이 될 수있는 접근 방법이 있습니까? 여기 Oracle AQ Java 소비자 연결에서 자주 발생하는 SQLNet 중단 오류
오라클 버전 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.
우리가 우리의 자바 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);
}
다음을 사용하여 ... DB를 측면에서 오류입니다 타이머 (15 초마다)를 사용하여 주기적으로이 블록을 호출하여 대기열을 배출합니다 ...
QueueReceiver qr = queueSession.createReceiver(queue);
while (true) {
Message message = qr.receive(1000);
if(message == null) {
break;
} else {
//process the msg
queueSession.commit();
}
}
이 오라클의 AQ 문서에서 참조 예를 들어 있었지만 그러나의 onMessage() 비동기 콜백 방식을 사용하여 우리는 여러 가지 이유로이 방법 ...
질문 # 1
을 선호하고 그것은 매우 간단 접근 방식처럼 보인다 , Java에서 메시지를 dequeueing하는보다 안정적인 방법이 있습니까? 명시 적으로 message.acknowledge()
를 호출하거나 queueSession.commit()
커버이 수행하는 CLIENT_ACK 모드가 범인이 될 수 있다면
질문 # 또한 2
, 내가 궁금하네요 ... 내가해야 하는가? 큐가
참조 비어 때마다 몇 가지 조사 후