2014-02-13 23 views
0

我們的DBA注意到很多SQLNet中斷錯誤歸因於Oracle AQ Java進程所產生的連接,這些錯誤會排除這些隊列。我沒有看到Java方面的任何錯誤,並且它看起來工作正常。有什麼關於我們的方法會導致這些休息?來自Oracle AQ Java消費者連接的頻繁的SQLNet中斷錯誤

這裏是從數據庫側的錯誤...使用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

雖然這是甲骨文公司的AQ文檔中引用的一個例子,它似乎是一個非常簡單的方法,有沒有一種更穩定的Java郵件出隊方式?

問題2

還,我想知道,如果CLIENT_ACK模式可能是罪魁禍首...我應該顯式調用message.acknowledge()或做了queueSession.commit()蓋呢?

回答

相關問題