15 Oracle Java Message Serviceの共有インタフェース
次のトピックでは、Oracle Database Advanced Queuing (AQ)に対するJava Message Service (JMS)操作インタフェース(共有インタフェース)を説明します。
Oracle Database Advanced Queuing JMS操作インタフェース: 共有インタフェース
次のトピックでは、JMS操作のためのOracle Database Advanced Queuing共有インタフェースを説明します。
JMSコネクションの起動
public void start() throws JMSException
AQjmsConnection.start()
は、メッセージ受信用のJMSコネクションを起動します。
JMSコネクションの取得
public oracle.jms.AQjmsConnection getJmsConnection() throws JMSException
AQjmsSession.getJmsConnection()
は、セッションからJMSコネクションを取得します。
セッションにおけるすべての操作のコミット
public void commit() throws JMSException
AQjmsSession.commit()
は、セッションで実行されているすべてのJMSおよびSQL操作をコミットします。
セッションにおけるすべての操作のロールバック
public void rollback() throws JMSException
AQjmsSession.rollback()
は、セッションで実行されているすべてのJMSおよびSQL操作を終了します。
セッションからのJDBCコネクションの取得
public java.sql.Connection getDBConnection() throws JMSException
AQjmsSession.getDBConnection()
は、JMSセッションから基礎となるJDBCコネクションを取得します。JDBCコネクションは、JMS操作が実行される同一のトランザクションの一部としてSQL操作を実行するために使用される場合があります。
例15-1 JMSセッションからの基礎となるJDBCコネクションの取得
java.sql.Connection db_conn; QueueSession jms_sess; db_conn = ((AQjmsSession)jms_sess).getDBConnection();
JMSコネクションからのOracleOCIConnectionPoolの取得
public oracle.jdbc.pool.OracleOCIConnectionPool getOCIConnectionPool()
AQjmsConnection.getOCIConnectionPool()
は、JMSコネクションから基礎となるOracleOCIConnectionPool
を取得します。OracleOCIConnectionPool
インスタンスの設定は、コネクションの使用状況(ユーザーが既存のコネクションを使用して確立するセッション数など)に応じてユーザーがチューニングできます。ただし、JMSコネクションが使用しているOracleOCIConnectionPool
インスタンスはクローズしないでください。
例15-2 JMSコネクションからの基礎となるOracleOCIConnectionPoolの取得
oracle.jdbc.pool.OracleOCIConnectionPool cpool; QueueConnection jms_conn; cpool = ((AQjmsConnection)jms_conn).getOCIConnectionPool();
MapMessageの作成
public javax.jms.MapMessage createMapMessage() throws JMSException
AQjmsSession.createMapMessage()
は、Mapメッセージを作成します。これを使用できるのは、宛先キュー/トピックを含むキュー表がペイロード型SYS.AQ$_JMS_MAP_MESSAGE
またはAQ$_JMS_MESSAGE
で作成された場合のみです。
StreamMessageの作成
public javax.jms.StreamMessage createStreamMessage() throws JMSException
AQjmsSession.createStreamMessage()
は、StreamMessageを作成します。これを使用できるのは、宛先キュー/トピックを含むキュー表がペイロード型SYS.AQ$_JMS_STREAM_MESSAGE
またはAQ$_JMS_MESSAGE
で作成された場合のみです。
ObjectMessageの作成
public javax.jms.ObjectMessage createObjectMessage(java.io.Serializable object) throws JMSException
AQjmsSession.createObjectMessage()
は、Objectメッセージを作成します。これを使用できるのは、宛先キュー/トピックを含むキュー表がペイロード型SYS.AQ$_JMS_OBJECT_MESSAGE
またはAQ$_JMS_MESSAGE
で作成された場合のみです。
TextMessageの作成
public javax.jms.TextMessage createTextMessage() throws JMSException
AQjmsSession.createTextMessage()
は、Textメッセージを作成します。これを使用できるのは、宛先キュー/トピックを含むキュー表がペイロード型SYS.AQ$_JMS_TEXT_MESSAGE
またはAQ$_JMS_MESSAGE
で作成された場合のみです。
JMSメッセージの作成
public javax.jms.Message createMessage() throws JMSException
AQjmsSession.createMessage()
は、JMSメッセージを作成します。AQ$_JMS_MESSAGE
メッセージを使用して、様々な型のメッセージを構成できます。メッセージ型は、次のいずれかである必要があります。
-
DBMS_AQ.JMS_TEXT_MESSAGE
-
DBMS_AQ.JMS_OBJECT_MESSAGE
-
DBMS_AQ.JMS_MAP_MESSAGE
-
DBMS_AQ.JMS_BYTES_MESSAGE
-
DBMS_AQ.JMS_STREAM_MESSAGE
このユーザー定義型を使用して、ヘッダーのみのJMSメッセージを作成することもできます。
AdtMessageの作成
public oracle.jms.AdtMessage createAdtMessage() throws JMSException
AQjmsSession.createAdtMessage()
は、AdtMessage
を作成します。これを使用できるのは、宛先キュー/トピックを含むキュー表がペイロード型Oracle ADTで作成された場合のみです。AdtMessage
には、CustomDatum
インタフェースを実装するオブジェクトが移入される必要があります。このオブジェクトは、キュー/トピックのペイロードとして定義されたSQL ADTのJavaマッピングである必要があります。SQL ADT型に対応するJavaクラスは、Jpublisherツールを使用して生成できます。
JMSメッセージ・プロパティの指定
JMSで始まるプロパティ名は、プロバイダ固有です。ユーザー定義のプロパティは、JMSで始めることができません。
次のプロバイダのプロパティは、Text、Stream、Object、BytesまたはMapMessageを使用するクライアントが設定できます。
-
JMSXAppID (string)
-
JMSXGroupID (string)
-
JMSXGroupSeq (int)
-
JMS_OracleExcpQ (string)
このメッセージ・プロパティでは例外キューを指定します。
-
JMS_OracleDelay (int)
このメッセージ・プロパティではメッセージの遅延秒数を指定します。
次のプロパティは、AdtMessage
に対して設定できます。
-
JMS_OracleExcpQ (String)
このメッセージ・プロパティでは、例外キューを
schema
.queue_name
として指定します。 -
JMS_OracleDelay (int)
このメッセージ・プロパティではメッセージの遅延秒数を指定します。
この項の内容は次のとおりです。
Booleanメッセージ・プロパティの設定
public void setBooleanProperty(java.lang.String name, boolean value) throws JMSException
AQjmsMessage.setBooleanProperty()
は、メッセージ・プロパティをBooleanとして指定します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
Booleanプロパティの名前 |
|
メッセージに設定するBooleanプロパティの値 |
Stringメッセージ・プロパティの設定
public void setStringProperty(java.lang.String name, java.lang.String value) throws JMSException
AQjmsMessage.setStringProperty()
は、メッセージ・プロパティをStringとして指定します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
Stringプロパティの名前 |
|
メッセージに設定するStringプロパティの値 |
Integerメッセージ・プロパティの設定
public void setIntProperty(java.lang.String name, int value) throws JMSException
AQjmsMessage.setIntProperty()
は、メッセージ・プロパティをIntegerとして指定します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
Integerプロパティの名前 |
|
メッセージに設定するIntegerプロパティの値 |
Doubleメッセージ・プロパティの設定
public void setDoubleProperty(java.lang.String name, double value) throws JMSException
AQjmsMessage.setDoubleProperty()
は、メッセージ・プロパティをDoubleとして指定します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
Doubleプロパティの名前 |
|
メッセージに設定するDoubleプロパティの値 |
Floatメッセージ・プロパティの設定
public void setFloatProperty(java.lang.String name, float value) throws JMSException
AQjmsMessage.setFloatProperty()
は、メッセージ・プロパティをFloatとして指定します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
Floatプロパティの名前 |
|
メッセージに設定するFloatプロパティの値 |
Byteメッセージ・プロパティの設定
public void setByteProperty(java.lang.String name, byte value) throws JMSException
AQjmsMessage.setByteProperty()
は、メッセージ・プロパティをByteとして指定します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
Byteプロパティの名前 |
|
メッセージに設定するByteプロパティの値 |
Longメッセージ・プロパティの設定
public void setLongProperty(java.lang.String name, long value) throws JMSException
AQjmsMessage.setLongProperty()
は、メッセージ・プロパティをLongとして指定します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
Longプロパティの名前 |
|
メッセージに設定するLongプロパティの値 |
Shortメッセージ・プロパティの設定
public void setShortProperty(java.lang.String name, short value) throws JMSException
AQjmsMessage.setShortProperty()
は、メッセージ・プロパティをShortとして指定します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
Shortプロパティの名前 |
|
メッセージに設定するShortプロパティの値 |
Objectメッセージ・プロパティの設定
public void setObjectProperty(java.lang.String name, java.lang.Object value) throws JMSException
AQjmsMessage.setObjectProperty()
は、メッセージ・プロパティをObjectとして指定します。オブジェクト化されたプリミティブ値(Boolean、Byte、Short、Integer、Long、Float、DoubleおよびString)のみサポートされています。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
JavaのObjectプロパティの名前 |
|
メッセージに設定するJavaのObjectプロパティの値 |
MessageProducerが送信するすべてのメッセージに対するデフォルトのTimeToLiveの設定
public void setTimeToLive(long timeToLive) throws JMSException
このメソッドは、MessageProducer
が送信するすべてのメッセージに対するデフォルトのTimeToLive
を設定します。メッセージの遅延が発生した後に計算されます。このメソッドには、次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
ミリ秒で指定されるメッセージのTime-To-Live(ゼロは無制限) |
例15-3 MessageProducerが送信するすべてのメッセージに対するデフォルトのTimeToLiveの設定
/* Set default timeToLive value to 100000 milliseconds for all messages sent by the QueueSender*/ QueueSender sender; sender.setTimeToLive(100000);
MessageProducerが送信するすべてのメッセージに対するデフォルトの優先順位の設定
public void setPriority(int priority) throws JMSException
このメソッドは、MessageProducer
が送信するすべてのメッセージに対するデフォルトのPriority
を設定します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
このMessageProducerのメッセージの優先順位。デフォルトは4です。 |
優先順位には、どの整数値でも指定できます。数値が小さいほど高い優先度を示します。優先順位がsend()
操作時に明示的に指定されている場合は、このメソッドで設定されたデフォルト値をオーバーライドします。
例15-4 QueueSenderが送信するすべてのメッセージに対するデフォルトの優先順位の設定
/* Set default priority value to 2 for all messages sent by the QueueSender*/ QueueSender sender; sender.setPriority(2);
例15-5 TopicPublisherが送信するすべてのメッセージに対するデフォルトの優先順位の設定
/* Set default priority value to 2 for all messages sent by the TopicPublisher*/ TopicPublisher publisher; publisher.setPriority(1);
AQjmsエージェントの作成
public void createAQAgent(java.lang.String agent_name, boolean enable_http, throws JMSException
このメソッドはAQjmsAgent
を作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
AQエージェントの名前。 |
|
TRUEに設定すると、このエージェントはHTTP経由でAQにアクセスできます。 |
メッセージの同期受信
タイムアウトを指定するか、待機なしで、メッセージを同期受信できます。また、変換を使用してメッセージを受信することもできます。
タイムアウト指定でのメッセージ・コンシューマの使用
public javax.jms.Message receive(long timeout) throws JMSException
このメソッドは、タイムアウトを指定し、メッセージ・コンシューマを使用してメッセージを受信します。
パラメータ | 説明 |
---|---|
|
タイムアウト値(ミリ秒単位) |
例15-6 タイムアウト指定でのメッセージ・コンシューマの使用
TopicConnectionFactory tc_fact = null; TopicConnection t_conn = null; TopicSession t_sess = null; TopicSession jms_sess; Topic shipped_orders; int myport = 5521; /* create connection and session */ tc_fact = AQjmsFactory.getTopicConnectionFactory( "MYHOSTNAME", "MYSID", myport, "oci8"); t_conn = tc_fact.createTopicConnection("jmstopic", "jmstopic"); jms_sess = t_conn.createTopicSession(true, Session.CLIENT_ACKNOWLEDGE); shipped_orders = ((AQjmsSession )jms_sess).getTopic( "WS", "Shipped_Orders_Topic"); /* create a subscriber, specifying the correct CustomDatumFactory and selector */ subscriber1 = jms_sess.createDurableSubscriber( shipped_orders, 'WesternShipping', " priority > 1 and tab.user_data.region like 'WESTERN %'", false, AQjmsAgent.getFactory()); /* receive, blocking for 30 seconds if there were no messages */ Message = subscriber.receive(30000);
例15-7 JMS: メッセージが届くまでブロック
public BolOrder get_new_order1(QueueSession jms_session) { Queue queue; QueueReceiver qrec; ObjectMessage obj_message; BolCustomer customer; BolOrder new_order = null; String state; try { /* get a handle to the new_orders queue */ queue = ((AQjmsSession) jms_session).getQueue("OE", "OE_neworders_que"); qrec = jms_session.createReceiver(queue); /* wait for a message to show up in the queue */ obj_message = (ObjectMessage)qrec.receive(); new_order = (BolOrder)obj_message.getObject(); customer = new_order.getCustomer(); state = customer.getState(); System.out.println("Order: for customer " + customer.getName()); } catch (JMSException ex) { System.out.println("Exception: " + ex); } return new_order; }
待機なしでのメッセージ・コンシューマの使用
public javax.jms.Message receiveNoWait() throws JMSException
このメソッドは、待機なしで、メッセージ・コンシューマを使用してメッセージを受信します。
例15-8 JMS: メッセージを非ブロック
public BolOrder poll_new_order3(QueueSession jms_session) { Queue queue; QueueReceiver qrec; ObjectMessage obj_message; BolCustomer customer; BolOrder new_order = null; String state; try { /* get a handle to the new_orders queue */ queue = ((AQjmsSession) jms_session).getQueue("OE", "OE_neworders_que"); qrec = jms_session.createReceiver(queue); /* check for a message to show in the queue */ obj_message = (ObjectMessage)qrec.receiveNoWait(); new_order = (BolOrder)obj_message.getObject(); customer = new_order.getCustomer(); state = customer.getState(); System.out.println("Order: for customer " + customer.getName()); } catch (JMSException ex) { System.out.println("Exception: " + ex); } return new_order; }
変換による宛先からのメッセージの受信
キューまたはトピックからメッセージを受信するときに変換を適用できます。メッセージを変換してから、JMSアプリケーションに戻します。
変換は、AQjmsQueueReceiver
、AQjmsTopicSubscriber
またはAQjmsTopicReceiver
のsetTransformation()
インタフェースを使用して指定できます。
例15-9 JMS: 変換による宛先からのメッセージの受信
Western Shippingアプリケーションが、OE_bookedorders_topicからメッセージを取得すると仮定します。これは、変換OE2WS
がメッセージをOracleオブジェクト型WS_order
として取得するよう指定します。WSOrder JavaクラスがJPublisherによって生成され、Oracleオブジェクト型WS.WS_order
にマップされると仮定します。
public AQjmsAdtMessage retrieve_bookedorders(TopicSession jms_session) AQjmsTopicReceiver receiver; Topic topic; Message msg = null; try { /* get a handle to the OE_bookedorders_topic */ topic = ((AQjmsSession)jms_session).getTopic("OE", "OE_bookedorders_topic"); /* Create a receiver for WShip */ receiver = ((AQjmsSession)jms_session).createTopicReceiver( topic, "WShip, null, WSOrder.getFactory()); /* set the transformation in the publisher */ receiver.setTransformation("OE2WS"); msg = receiver.receive(10); } catch (JMSException ex) { System.out.println("Exception :", ex); } return (AQjmsAdtMessage)msg; }
メッセージの受信に対するナビゲーション・モードの指定
public void setNavigationMode(int mode) throws JMSException
このメソッドは、メッセージの受信に対するナビゲーション・モードを指定します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
ナビゲーション・モードの新規値 |
例15-10 メッセージの受信に対するナビゲーション・モードの指定
TopicConnectionFactory tc_fact = null; TopicConnection t_conn = null; TopicSession t_sess = null; TopicSession jms_sess; Topic shipped_orders; int myport = 5521; /* create connection and session */ tc_fact = AQjmsFactory.getTopicConnectionFactory( "MYHOSTNAME", "MYSID", myport, "oci8"); t_conn = tc_fact.createTopicConnection("jmstopic", "jmstopic"); jms_sess = t_conn.createTopicSession(true, Session.CLIENT_ACKNOWLEDGE); shipped_orders = ((AQjmsSession )jms_sess).getTopic("WS", "Shipped_Orders_Topic"); /* create a subscriber, specifying the correct CustomDatumFactory and selector */ subscriber1 = jms_sess.createDurableSubscriber( shipped_orders, 'WesternShipping', "priority > 1 and tab.user_data.region like 'WESTERN %'", false, AQjmsAgent.getFactory()); subscriber1.setNavigationMode(AQjmsConstants.NAVIGATION_FIRST_MESSAGE); /* get message for the subscriber, returning immediately if there was nomessage */ Message = subscriber.receive();
メッセージの非同期受信
メッセージを非同期に受信するには、次の2つの方法があります。
メッセージ・コンシューマに対するメッセージ・リスナーの指定
public void setMessageListener(javax.jms.MessageListener myListener) throws JMSException
このメソッドは、メッセージ・コンシューマに対してメッセージ・リスナーを指定します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
コンシューマに対してメッセージ・リスナーを設定します。 |
例15-11 メッセージ・コンシューマに対するメッセージ・リスナーの指定
TopicConnectionFactory tc_fact = null; TopicConnection t_conn = null; TopicSession t_sess = null; TopicSession jms_sess; Topic shipped_orders; int myport = 5521; MessageListener mLis = null; /* create connection and session */ tc_fact = AQjmsFactory.getTopicConnectionFactory( "MYHOSTNAME", "MYSID", myport, "oci8"); t_conn = tc_fact.createTopicConnection("jmstopic", "jmstopic"); jms_sess = t_conn.createTopicSession(true, Session.CLIENT_ACKNOWLEDGE); shipped_orders = ((AQjmsSession )jms_sess).getTopic( "WS", "Shipped_Orders_Topic"); /* create a subscriber, specifying the correct CustomDatumFactory and selector */ subscriber1 = jms_sess.createDurableSubscriber( shipped_orders, 'WesternShipping', "priority > 1 and tab.user_data.region like 'WESTERN %'", false, AQjmsAgent.getFactory()); mLis = new myListener(jms_sess, "foo"); /* get message for the subscriber, returning immediately if there was nomessage */ subscriber.setMessageListener(mLis); The definition of the myListener class import oracle.AQ.*; import oracle.jms.*; import javax.jms.*; import java.lang.*; import java.util.*; public class myListener implements MessageListener { TopicSession mySess; String myName; /* constructor */ myListener(TopicSession t_sess, String t_name) { mySess = t_sess; myName = t_name; } public onMessage(Message m) { System.out.println("Retrieved message with correlation: " || m.getJMSCorrelationID()); try{ /* commit the dequeue */ mySession.commit(); } catch (java.sql.SQLException e) {System.out.println("SQL Exception on commit"); } } }
メッセージIDの取得
この項の内容は次のとおりです。
相関識別子の取得
public java.lang.String getJMSCorrelationID() throws JMSException
AQjmsMessage.getJMSCorrelationID()
は、メッセージの相関識別子を取得します。
JMSメッセージ・プロパティの取得
この項の内容は次のとおりです。
Booleanメッセージ・プロパティの取得
public boolean getBooleanProperty(java.lang.String name) throws JMSException
AQjmsMessage.getBooleanProperty()
は、メッセージ・プロパティをBooleanとして取得します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
Booleanプロパティの名前 |
Stringメッセージ・プロパティの取得
public java.lang.String getStringProperty(java.lang.String name) throws JMSException
AQjmsMessage.getStringProperty()
は、メッセージ・プロパティをStringとして取得します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
Stringプロパティの名前 |
Integerメッセージ・プロパティの取得
public int getIntProperty(java.lang.String name) throws JMSException
AQjmsMessage.getIntProperty()
は、メッセージ・プロパティをIntegerとして取得します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
Integerプロパティの名前 |
Doubleメッセージ・プロパティの取得
public double getDoubleProperty(java.lang.String name) throws JMSException
AQjmsMessage.getDoubleProperty()
は、メッセージ・プロパティをDoubleとして取得します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
Doubleプロパティの名前 |
Floatメッセージ・プロパティの取得
public float getFloatProperty(java.lang.String name) throws JMSException
AQjmsMessage.getFloatProperty()
は、メッセージ・プロパティをFloatとして取得します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
Floatプロパティの名前 |
Byteメッセージ・プロパティの取得
public byte getByteProperty(java.lang.String name) throws JMSException
AQjmsMessage.getByteProperty()
は、メッセージ・プロパティをByteとして取得します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
Byteプロパティの名前 |
Longメッセージ・プロパティの取得
public long getLongProperty(java.lang.String name) throws JMSException
AQjmsMessage.getLongProperty()
は、メッセージ・プロパティをLongとして取得します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
Longプロパティの名前 |
Shortメッセージ・プロパティの取得
public short getShortProperty(java.lang.String name) throws JMSException
AQjmsMessage.getShortProperty()は、メッセージ・プロパティをShortとして取得します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
Shortプロパティの名前 |
Objectメッセージ・プロパティの取得
public java.lang.Object getObjectProperty(java.lang.String name) throws JMSException
AQjmsMessage.getObjectProperty()
は、メッセージ・プロパティをObjectとして取得します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
Objectプロパティの名前 |
例15-12 Objectメッセージ・プロパティの取得
TextMessage message; message.getObjectProperty("empid", new Integer(1000);
クローズおよびシャットダウン
この項の内容は次のとおりです。
MessageProducerのクローズ
public void close() throws JMSException
AQjmsProducer.close()
はMessageProducer
をクローズします。
メッセージ・コンシューマのクローズ
public void close() throws JMSException
AQjmsConsumer.close()
は、メッセージ・コンシューマをクローズします。
トラブルシューティング
この項の内容は次のとおりです。
JMSエラー・コードの取得
public java.lang.String getErrorCode()
AQjmsException.getErrorCode()
は、JMS例外のエラー・コードを取得します。
JMSエラー番号の取得
public int getErrorNumber()
AQjmsException.getErrorNumber()
は、JMS例外のエラー番号を取得します。
注意:
このメソッドは今後のリリースでは使用されなくなります。かわりに、getErrorCode()
を使用してください。
JMS例外にリンクされた例外の取得
public java.lang.String getLinkString()
AQjmsException.getLinkString()
は、JMS例外にリンクされた例外を取得します。一般に、この例外にはデータベースで発行されるSQL例外が含まれます。
JMS例外のスタック・トレースの出力
public void printStackTrace(java.io.PrintStream s)
AQjmsException.printStackTrace()
は、JMS例外のスタック・トレースを出力します。
例外リスナーの設定
public void setExceptionListener(javax.jms.ExceptionListener listener) throws JMSException
AQjmsConnection.setExceptionListener()
は、コネクション用の例外リスナーを指定します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
例外リスナー |
例外リスナーの登録が完了している場合は、コネクションに重大な問題が検出されると通知されます。これは、リスナーのonException()
メソッドをコールして、問題を説明するJMS例外を渡すことによって実行されます。これによって、問題がJMSクライアントに非同期に通知されます。メッセージを処理するのみのコネクションもあるため、コネクションが失敗したことを知るための他の方法がありません。
例15-13 コネクション用の例外リスナーの指定
//register an exception listener Connection jms_connection; jms_connection.setExceptionListener( new ExceptionListener() { public void onException (JMSException jmsException) { System.out.println("JMS-EXCEPTION: " + jmsException.toString()); } }; );
例外リスナーの取得
public javax.jms.ExceptionListener getExceptionListener() throws JMSException
AQjmsConnection.getExceptionListener()
は、コネクション用の例外リスナーを取得します。
例15-14に、ExceptionListener
とMessageListener
の組合せ使用の方法を示します。次の条件が満たされていることを確認してください。
-
ユーザー
jmsuser
(パスワードjmsuser
)が、適切な権限を所有してデータベースに作成されます。 -
キュー
demoQueue
が作成され起動されます。
この例は、コネクション再起動があり、例外リスナーがJMSオブジェクトを再作成する場合に、MessageListenerが非同期にメッセージを受信する方法を示します。
例15-14 ExceptionListenerとMessageListenerの組合せ使用
import java.util.Enumeration; import java.util.Properties; import javax.jms.Connection; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageConsumer; import javax.jms.MessageProducer; import javax.jms.Queue; import javax.jms.QueueBrowser; import javax.jms.Session; import javax.jms.TextMessage; import oracle.jms.AQjmsConnectionFactory; import oracle.jms.AQjmsFactory; import oracle.jms.AQjmsSession; public class JMSDemo { static String queueName = "demoQueue"; static String queueOwner = "jmsuser"; static String queueOwnerPassword = "jmsuser"; static Connection connection = null; static int numberOfMessages = 25000; static int messageCount = 0; static String jdbcURL = ""; public static void main(String args[]) { try { jdbcURL = System.getProperty("JDBC_URL"); if (jdbcURL == null) System.out .println("The system property JDBC_URL has not been set, " + "usage:java -DJDBC_URL=xxx filename "); else { JMSDemo demo = new JMSDemo(); demo.performJmsOperations(); } } catch (Exception exception) { System.out.println("Exception : " + exception); exception.printStackTrace(); } finally { try { if (connection != null) connection.close(); } catch (Exception exc) { exc.printStackTrace(); } } System.out.println("\nEnd of Demo aqjmsdemo11."); } public void performJmsOperations() { try { connection = getConnection(jdbcURL); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Queue queue = session.createQueue(queueName); // remove the messages from the Queue drainQueue(queueName, queueOwner, jdbcURL, true); // set the exception listener on the Connection connection.setExceptionListener(new DemoExceptionListener()); MessageProducer producer = session.createProducer(queue); TextMessage textMessage = null; System.out.println("Sending " + numberOfMessages + " messages to queue " + queueName); for (int i = 0; i < numberOfMessages; i++) { textMessage = session.createTextMessage(); textMessage.setText("Sample message text"); producer.send(textMessage); } MessageConsumer consumer = session.createConsumer(queue); System.out.println("Setting the message listener ..."); consumer.setMessageListener(new DemoMessageListener()); connection.start(); // Introduce a long wait to allow the listener to receive all the messages while (messageCount < numberOfMessages) { try { Thread.sleep(5000); } catch (InterruptedException interruptedException) { } } } catch (JMSException jmsException) { jmsException.printStackTrace(); } } // Sample message listener static class DemoMessageListener implements javax.jms.MessageListener { public void onMessage(Message message) { try { System.out.println("Message listener received message with JMSMessageID " + message.getJMSMessageID()); messageCount++; } catch (JMSException jmsException) { System.out.println("JMSException " + jmsException.getMessage()); } } } // sample exception listener static class DemoExceptionListener implements javax.jms.ExceptionListener { public void onException(JMSException jmsException) { try { // As a first step close the connection if (connection != null) connection.close(); } catch (JMSException exception) {} try { System.out.println("Re-create the necessary JMS objects ..."); connection = getConnection(jdbcURL); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Queue queue = session.createQueue(queueName); MessageConsumer consumer = session.createConsumer(queue); consumer.setMessageListener(new DemoMessageListener()); } catch (JMSException newJmsException) { newJmsException.printStackTrace(); } } } // Utility method to get a connection static Connection getConnection(String jdbcUrl) throws JMSException { Properties prop = new Properties(); prop.put("user", queueOwner); prop.put("password", queueOwnerPassword); AQjmsConnectionFactory fact = (AQjmsConnectionFactory) AQjmsFactory .getConnectionFactory(jdbcUrl, prop); Connection conn = fact.createConnection(); return conn; } // Utility method to remove the messages from the queue static void drainQueue(String queueName, String queueOwner, String jdbcUrl, boolean debugInfo) { Connection connection = null; Session session = null; long timeout = 10000; int count = 0; Message message = null; try { connection = getConnection(jdbcUrl); connection.start(); session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Queue queue = ((AQjmsSession) session).getQueue(queueOwner, queueName); MessageConsumer messageConsumer = session.createConsumer(queue); QueueBrowser browser = session.createBrowser(queue); Enumeration enumeration = browser.getEnumeration(); if (enumeration.hasMoreElements()) { while ((message = messageConsumer.receive(timeout)) != null) { if (debugInfo) { count++; } } } messageConsumer.close(); if (debugInfo) { System.out.println("Removed " + count + " messages from the queue : " + queueName); } } catch (JMSException jmsException) { jmsException.printStackTrace(); } finally { try { if (session != null) session.close(); if (connection != null) connection.close(); } catch (Exception exception) { } } } }
例15-15 コネクション用の例外リスナーの取得
//Get the exception listener Connection jms_connection; ExceptionListener el = jms_connection.getExceptionListener();