連線事件通知可讓 Message Queue 用戶端偵聽關閉事件與重新連線事件,並根據通知類型與連線狀態採取適當的動作。例如,當發生容錯移轉且用戶端重新連線至其他代理程式時,應用程式最好清除作業事件狀態,並進行新的作業事件。
如果 Message Queue 提供者偵測到嚴重的連線問題,它會呼叫連線物件的已註冊之異常偵聽程式。它會呼叫偵聽程式的 onException 方法,並傳遞描述問題的 JMSException 引數給該方法。Message Queue 提供者亦可提供事件通知 API,讓用戶端執行階段將連線狀態的變更通知應用程式。通知 API 由下列元素所定義:
定義事件偵聽程式及通知事件物件的 com.sun.messaging.jms.notification 套裝模組。
定義 javax.jms.Connection 介面延伸的 com.sun.messaging.jms.Connection 介面。
以下小節說明可觸發通知的事件,並說明建立事件偵聽程式的方式。
下表列出並說明事件偵聽程式會傳回的事件。
請注意,發生連線事件時,不會呼叫 JMS 異常偵聽程式。只有在用戶端執行階段用盡重新連線的嘗試次數時,才會呼叫異常偵聽程式。用戶端執行階段一律會先呼叫事件偵聽程式,再呼叫異常偵聽程式。
表 1–8 通知事件
事件類型 |
意義 |
---|---|
ConnectionClosingEvent |
當 Message Queue 用戶端執行階段收到代理程式的通知,指出由於管理員請求關閉,因此連線即將關閉時,即會產生此事件。 |
ConnectionClosedEvent |
當連線由於代理程式錯誤或由於管理員請求關閉或重新啟動而關閉時,Message Queue 用戶端執行階段會產生此事件。 當事件偵聽程式收到 ConnectionClosedEvent 時,應用程式可使用已接收事件的 getEventCode() 方法取得指出關閉原因的事件代碼。 |
ConnectionReconnectedEvent |
Message Queue 用戶端執行階段已重新連線至代理程式。這可能是用戶端之前連線的同一個或不同的代理程式。 應用程式可使用已接收事件的 getBrokerAddress 方法取得重新連線的代理程式位址。 |
ConnectionReconnectFailedEvent |
Message Queue 用戶端執行階段無法重新連線至代理程式。每次重新連線嘗試失敗時,執行階段即會產生新的事件,並將其傳送到事件偵聽程式。 發生連線事件時,不會呼叫 JMS 異常偵聽程式。只有在用戶端執行階段用盡重新連線的嘗試次數時,才會呼叫。用戶端執行階段一律會先呼叫事件偵聽程式,再呼叫異常偵聽程式。 |
下列程式碼範例描述設定連線事件偵聽程式的方式。每次發生連線事件時,用戶端執行階段便會呼叫事件偵聽程式的 onEvent 方法。
//create an MQ connection factory. com.sun.messaging.ConnectionFactory factory = new com.sun.messaging.ConnectionFactory(); //create an MQ connection. com.sun.messaging.jms.Connection connection = (com.sun.messaging.jms.Connection )factory.createConnection(); //construct an MQ event listener. The listener implements //com.sun.messaging.jms.notification.EventListener interface. com.sun.messaging.jms.notification.EventListener eListener = new ApplicationEventListener(); //set event listener to the MQ connection. connection.setEventListener ( eListener );
在此範例中,應用程式選擇事件偵聽程式將連線事件記錄到應用程式的記錄系統:
public class ApplicationEventListener implements com.sun.messaging.jms.notification.EventListener { public void onEvent ( com.sun.messaging.jms.notification.Event connEvent ) { log (connEvent); } private void log ( com.sun.messaging.jms.notification.Event connEvent ) { String eventCode = connEvent.getEventCode(); String eventMessage = connEvent.getEventMessage(); //write event information to the output stream. } }