ヘッダーをスキップ
Oracle® Databaseアドバンスト・キューイング・ユーザーズ・ガイド
12c リリース1 (12.1)
B71332-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

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();

BytesMessageの作成

public javax.jms.BytesMessage createBytesMessage()
                                          throws JMSException

AQjmsSession.createBytesMessage()は、Bytesメッセージを作成します。これを使用できるのは、宛先キュー/トピックを含むキュー表がペイロード型SYS.AQ$_JMS_BYTES_MESSAGEまたはAQ$_JMS_MESSAGEで作成された場合のみです。

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

このADTを使用して、ヘッダーのみのJMSメッセージを作成することもできます。

AdtMessageの作成

public oracle.jms.AdtMessage createAdtMessage()
                                       throws JMSException

AQjmsSession.createAdtMessage()は、AdtMessageを作成します。これを使用できるのは、宛先キュー/トピックを含むキュー表がペイロード型Oracle ADTで作成された場合のみです。AdtMessageには、CustomDatumインタフェースを実装するオブジェクトが移入される必要があります。このオブジェクトは、キュー/トピックのペイロードとして定義されたSQL ADTのJavaマッピングである必要があります。SQL ADT型に対応するJavaクラスは、Jpublisherツールを使用して生成できます。

JMS相関識別子の設定

public void setJMSCorrelationID(java.lang.String correlationID)
                         throws JMSException

AQjmsMessage.setJMSCorrelationID()は、メッセージの相関識別子を指定します。

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として指定します。次のパラメータがあります。

パラメータ 説明
name Booleanプロパティの名前
value メッセージに設定するBooleanプロパティの値

Stringメッセージ・プロパティの設定

public void setStringProperty(java.lang.String name,
                              java.lang.String value)
                       throws JMSException

AQjmsMessage.setStringProperty()は、メッセージ・プロパティをStringとして指定します。次のパラメータがあります。

パラメータ 説明
name Stringプロパティの名前
value メッセージに設定するStringプロパティの値

Integerメッセージ・プロパティの設定

public void setIntProperty(java.lang.String name,
                           int value)
                    throws JMSException

AQjmsMessage.setIntProperty()は、メッセージ・プロパティをIntegerとして指定します。次のパラメータがあります。

パラメータ 説明
name Integerプロパティの名前
value メッセージに設定するIntegerプロパティの値

Doubleメッセージ・プロパティの設定

public void setDoubleProperty(java.lang.String name,
                              double value)
                       throws JMSException

AQjmsMessage.setDoubleProperty()は、メッセージ・プロパティをDoubleとして指定します。次のパラメータがあります。

パラメータ 説明
name Doubleプロパティの名前
value メッセージに設定するDoubleプロパティの値

Floatメッセージ・プロパティの設定

public void setFloatProperty(java.lang.String name,
                             float value)
                      throws JMSException

AQjmsMessage.setFloatProperty()は、メッセージ・プロパティをFloatとして指定します。次のパラメータがあります。

パラメータ 説明
name Floatプロパティの名前
value メッセージに設定するFloatプロパティの値

Byteメッセージ・プロパティの設定

public void setByteProperty(java.lang.String name,
                            byte value)
                     throws JMSException

AQjmsMessage.setByteProperty()は、メッセージ・プロパティをByteとして指定します。次のパラメータがあります。

パラメータ 説明
name Byteプロパティの名前
value メッセージに設定するByteプロパティの値

Longメッセージ・プロパティの設定

public void setLongProperty(java.lang.String name,
                            long value)
                     throws JMSException

AQjmsMessage.setLongProperty()は、メッセージ・プロパティをLongとして指定します。次のパラメータがあります。

パラメータ 説明
name Longプロパティの名前
value メッセージに設定するLongプロパティの値

Shortメッセージ・プロパティの設定

public void setShortProperty(java.lang.String name,
                             short value)
                      throws JMSException

AQjmsMessage.setShortProperty()は、メッセージ・プロパティをShortとして指定します。次のパラメータがあります。

パラメータ 説明
name Shortプロパティの名前
value メッセージに設定する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)のみサポートされています。次のパラメータがあります。

パラメータ 説明
name JavaのObjectプロパティの名前
value メッセージに設定するJavaのObjectプロパティの値

MessageProducerが送信するすべてのメッセージに対するデフォルトのTimeToLiveの設定

public void setTimeToLive(long timeToLive)
                   throws JMSException

このメソッドは、MessageProducerが送信するすべてのメッセージに対するデフォルトのTimeToLiveを設定します。メッセージの遅延が発生した後に計算されます。このメソッドには、次のパラメータがあります。

パラメータ 説明
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を設定します。次のパラメータがあります。

パラメータ 説明
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を作成します。次のパラメータがあります。

パラメータ 説明
agent_name AQエージェントの名前。
enable_http TRUEに設定すると、このエージェントはHTTP経由でAQにアクセスできます。

メッセージの同期受信

タイムアウトを指定するか、待機なしで、メッセージを同期受信できます。また、変換を使用してメッセージを受信することもできます。

タイムアウト指定でのメッセージ・コンシューマの使用

public javax.jms.Message receive(long timeout)
                          throws JMSException

このメソッドは、タイムアウトを指定し、メッセージ・コンシューマを使用してメッセージを受信します。

パラメータ 説明
timeout タイムアウト値(ミリ秒単位)

例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アプリケーションに戻します。

変換は、AqjmsQueueReceiverAQjmsTopicSubscriberまたはAQjmsTopicReceiversetTransformation()インタフェースを使用して指定できます。

例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

このメソッドは、メッセージの受信に対するナビゲーション・モードを指定します。次のパラメータがあります。

パラメータ 説明
mode ナビゲーション・モードの新規値

例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

このメソッドは、メッセージ・コンシューマに対してメッセージ・リスナーを指定します。次のパラメータがあります。

パラメータ 説明
myListener コンシューマに対してメッセージ・リスナーを設定します。

例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"); }
   }
}

セッションに対するメッセージ・リスナーの指定

public void setMessageListener(javax.jms.MessageListener listener)
                        throws JMSException

このメソッドは、セッションに対してメッセージ・リスナーを指定します。

パラメータ 説明
listener このセッションに関連付けするメッセージ・リスナー

メッセージIDの取得

この項の内容は次のとおりです。

相関識別子の取得

public java.lang.String getJMSCorrelationID()
          throws JMSException

AQjmsMessage.getJMSCorrelationID()は、メッセージの相関識別子を取得します。

メッセージ識別子の取得

public byte[] getJMSCorrelationIDAsBytes()
          throws JMSException

AQjmsMessage.getJMSMessageID()は、メッセージのメッセージ識別子をバイトまたは文字列として取得します。

JMSメッセージ・プロパティ

この項の内容は次のとおりです。

Booleanメッセージ・プロパティの取得

public boolean getBooleanProperty(java.lang.String name)
          throws JMSException

AQjmsMessage.getBooleanProperty()は、メッセージ・プロパティをBooleanとして取得します。次のパラメータがあります。

パラメータ 説明
name Booleanプロパティの名前

Stringメッセージ・プロパティの取得

public java.lang.String getStringProperty(java.lang.String name)
          throws JMSException

AQjmsMessage.getStringProperty()は、メッセージ・プロパティをStringとして取得します。次のパラメータがあります。

パラメータ 説明
name Stringプロパティの名前

Integerメッセージ・プロパティの取得

public int getIntProperty(java.lang.String name)
          throws JMSException

AQjmsMessage.getIntProperty()は、メッセージ・プロパティをIntegerとして取得します。次のパラメータがあります。

パラメータ 説明
name Integerプロパティの名前

Doubleメッセージ・プロパティの取得

public double getDoubleProperty(java.lang.String name)
                         throws JMSException

AQjmsMessage.getDoubleProperty()は、メッセージ・プロパティをDoubleとして取得します。次のパラメータがあります。

パラメータ 説明
name Doubleプロパティの名前

Floatメッセージ・プロパティの取得

public float getFloatProperty(java.lang.String name)
          throws JMSException

AQjmsMessage.getFloatProperty()は、メッセージ・プロパティをFloatとして取得します。次のパラメータがあります。

パラメータ 説明
name Floatプロパティの名前

Byteメッセージ・プロパティの取得

public byte getByteProperty(java.lang.String name)
          throws JMSException

AQjmsMessage.getByteProperty()は、メッセージ・プロパティをByteとして取得します。次のパラメータがあります。

パラメータ 説明
name Byteプロパティの名前

Longメッセージ・プロパティの取得

public long getLongProperty(java.lang.String name)
          throws JMSException

AQjmsMessage.getLongProperty()は、メッセージ・プロパティをLongとして取得します。次のパラメータがあります。

パラメータ 説明
name Longプロパティの名前

Shortメッセージ・プロパティの取得

public short getShortProperty(java.lang.String name)
                       throws JMSException

AQjmsMessage.getShortProperty()は、メッセージ・プロパティをShortとして取得します。次のパラメータがあります。

パラメータ 説明
name Shortプロパティの名前

Objectメッセージ・プロパティの取得

public java.lang.Object getObjectProperty(java.lang.String name)
                                   throws JMSException

AQjmsMessage.getObjectProperty()は、メッセージ・プロパティをObjectとして取得します。次のパラメータがあります。

パラメータ 説明
name 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 void stop()
          throws JMSException

AQjmsConnection.stop()はJMSコネクションを停止します。

JMSセッションのクローズ

public void close()
           throws JMSException

AQjmsSession.close()はJMSセッションをクローズします。

JMSコネクションのクローズ

public void close()
          throws JMSException

AQjmsConnection.close()はJMSコネクションをクローズし、コネクションのために割り当てられているすべてのリソースを解放します。通常、JMSのプロバイダは重要なリソースをコネクションのためにJVMの外部に割り当てるため、クライアントはこれらのリソースが必要ない場合はクローズする必要があります。ガベージ・コレクションによる最終的なリソースの解放を待つ必要はありません。

トラブルシューティング

この項の内容は次のとおりです。

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()は、コネクション用の例外リスナーを指定します。次のパラメータがあります。

パラメータ 説明
listener 例外リスナー

例外リスナーの登録が完了している場合は、コネクションに重大な問題が検出されると通知されます。これは、リスナーの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に、ExceptionListenerMessageListenerの組合せ使用の方法を示します。次の条件が満たされていることを確認してください。

  • ユーザー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();