2014-02-13 1 views
0

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

, 내가 궁금하네요 ... 내가해야 하는가? 큐가

참조 비어 때마다 몇 가지 조사 후

답변

관련 문제