14 Oracle Java Message Serviceのパブリッシュ/サブスクライブ
次のトピックでは、Oracle Database Advanced Queuing (AQ)のJava Message Service (JMS)操作インタフェースのうち、パブリッシュ・サブスクライブ操作固有のコンポーネントについて説明します。Point-to-Pointおよびパブリッシュ/サブスクライブで共有されるコンポーネントについては、「Oracle Java Message Serviceの共有インタフェース」を参照してください。
14.1 ユーザー名/パスワードが設定されたConnectionの作成
public javax.jms.Connection createConnection( java.lang.String username, java.lang.String password) throws JMSException
このメソッドは、指定されたユーザー名とパスワードを使用して、Point-to-Point操作とパブリッシュ/サブスクライブ操作の両方をサポートするコネクションを作成します。これは新規メソッドで、JMSバージョン1.1仕様をサポートしています。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
キュー用にデータベースに接続するユーザー名 |
|
サーバーへの接続を作成するためのパスワード |
14.2 コネクションの確立: デフォルトのConnectionFactoryパラメータの使用
public javax.jms.Connection createConnection() throws JMSException
このメソッドは、デフォルトのConnectionFactoryパラメータを使用して、Point-to-Point操作とパブリッシュ・サブスクライブ操作の両方をサポートするコネクションを作成します。これは新規メソッドで、JMSバージョン1.1仕様をサポートしています。ConnectionFactory
プロパティにデフォルトのユーザー名およびパスワードを含めないと、JMSExceptionが発生します。
14.3 ユーザー名/パスワードが設定されたTopicConnectionの作成
public javax.jms.TopicConnection createTopicConnection( java.lang.String username, java.lang.String password) throws JMSException
このメソッドは、指定されたユーザー名とパスワードを使用してTopicConnection
を作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
キュー用にデータベースに接続するユーザー名 |
|
サーバーへの接続を作成するためのパスワード |
例14-1 ユーザー名/パスワードが設定されたTopicConnectionの作成
TopicConnectionFactory tc_fact = AQjmsFactory.getTopicConnectionFactory("sun123", "oratest", 5521, "thin"); /* Create a TopicConnection using a username/password */ TopicConnection tc_conn = tc_fact.createTopicConnection("jmsuser", "jmsuser");
14.4 TopicConnectionの確立: オープンしているJDBCコネクションの使用
public static javax.jms.TopicConnection createTopicConnection( java.sql.Connection jdbc_connection) throws JMSException
このメソッドは、オープンしているJDBCコネクションを使用してTopicConnection
を作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
データベースへの有効なオープン・コネクション |
例14-2 TopicConnectionの確立: オープンしているJDBCコネクションの使用
Connection db_conn; /*previously opened JDBC connection */ TopicConnection tc_conn = AQjmsTopicConnectionFactory createTopicConnection(db_conn);
例14-3 TopicConnectionの確立: 新規JDBCコネクションの使用
OracleDriver ora = new OracleDriver(); TopicConnection tc_conn = AQjmsTopicConnectionFactory.createTopicConnection(ora.defaultConnection());
14.5 TopicConnectionの確立: オープンしているOracleOCIConnectionPoolの使用
public static javax.jms.TopicConnection createTopicConnection( oracle.jdbc.pool.OracleOCIConnectionPool cpool) throws JMSException
このメソッドは、オープンしているOracleOCIConnectionPool
を使用してTopicConnection
を作成します。これは静的であり、次のパラメータを取ります。
パラメータ | 説明 |
---|---|
|
データベースに対してオープンなOCIコネクション・プール |
例14-4 TopicConnectionの確立: オープンしているOracleOCIConnectionPoolの使用
OracleOCIConnectionPool cpool; /* previously created OracleOCIConnectionPool */ TopicConnection tc_conn = AQjmsTopicConnectionFactory.createTopicConnection(cpool);
14.6 セッションの作成
public javax.jms.Session createSession(boolean transacted, int ack_mode) throws JMSException
このメソッドは、Point-to-Point操作とパブリッシュ・サブスクライブ操作の両方をサポートするSession
を作成します。これは新規で、JMSバージョン1.1仕様をサポートしています。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
TRUEに設定すると、セッションはトランザクションになります。 |
|
コンシューマまたはクライアントが受信したメッセージを認識するかどうかを示します。トランザクション処理のセッションの場合は無視されます。有効な値は |
14.7 TopicSessionの作成
public javax.jms.TopicSession createTopicSession(boolean transacted, int ack_mode) throws JMSException
このメソッドはTopicSession
を作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
TRUEに設定すると、セッションはトランザクションになります。 |
|
コンシューマまたはクライアントが受信したメッセージを認識するかどうかを示します。トランザクション処理のセッションの場合は無視されます。有効な値は |
例14-5 TopicSessionの作成
TopicConnection tc_conn; TopicSession t_sess = tc_conn.createTopicSession(true,0);
14.8 TopicPublisherの作成
public javax.jms.TopicPublisher createPublisher(javax.jms.Topic topic) throws JMSException
このメソッドはTopicPublisher
を作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
パブリッシュ対象のトピック。識別されていないプロデューサの場合は、NULL。 |
14.9 メッセージのパブリッシュ: 最小限の指定
public void publish(javax.jms.Message message) throws JMSException
このメソッドは、最小限の指定でメッセージをパブリッシュします。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
送信するメッセージ |
TopicPublisher
では、メッセージのpriority
(1
)とtimeToLive
(infinite
)のデフォルト値を使用します。
例14-6 トピック指定なしのパブリッシュ
/* Publish without specifying topic */ TopicConnectionFactory tc_fact = null; TopicConnection t_conn = null; TopicSession jms_sess; TopicPublisher publisher1; 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"); /* create TopicSession */ jms_sess = t_conn.createTopicSession(true, Session.CLIENT_ACKNOWLEDGE); /* get shipped orders topic */ shipped_orders = ((AQjmsSession )jms_sess).getTopic( "OE", "Shipped_Orders_Topic"); publisher1 = jms_sess.createPublisher(shipped_orders); /* create TextMessage */ TextMessage jms_sess.createTextMessage(); /* publish without specifying the topic */ publisher1.publish(text_message);
例14-7 相関と遅延の指定によるパブリッシュ
TopicConnectionFactory tc_fact = null; TopicConnection t_conn = null; TopicSession jms_sess; TopicPublisher publisher1; 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( "OE", "Shipped_Orders_Topic"); publisher1 = jms_sess.createPublisher(shipped_orders); /* Create TextMessage */ TextMessage jms_sess.createTextMessage(); /* Set correlation and delay */ /* Set correlation */ jms_sess.setJMSCorrelationID("FOO"); /* Set delay of 30 seconds */ jms_sess.setLongProperty("JMS_OracleDelay", 30); /* Publish */ publisher1.publish(text_message);
14.10 トピック指定によるメッセージのパブリッシュ
public void publish(javax.jms.Topic topic, javax.jms.Message message) throws JMSException
このメソッドは、トピックを指定してメッセージをパブリッシュします。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
パブリッシュするトピック |
|
送信するメッセージ |
TopicPublisher
がデフォルトのトピックで作成されている場合、publish()
コールにtopic
パラメータを指定することはできません。トピックが指定されている場合、その値はTopicPublisher
のデフォルトのトピックをオーバーライドします。TopicPublisher
がデフォルトのトピックを使用しないで作成されている場合、publish()
コールごとにトピックを指定する必要があります。
例14-8 トピック指定によるパブリッシュ
/* Publish specifying topic */ TopicConnectionFactory tc_fact = null; TopicConnection t_conn = null; TopicSession jms_sess; TopicPublisher publisher1; 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); /* create TopicPublisher */ publisher1 = jms_sess.createPublisher(null); /* get topic object */ shipped_orders = ((AQjmsSession )jms_sess).getTopic( 'WS', 'Shipped_Orders_Topic'); /* create text message */ TextMessage jms_sess.createTextMessage(); /* publish specifying the topic */ publisher1.publish(shipped_orders, text_message);
14.11 メッセージのパブリッシュ: 配信モード、優先順位およびTimeToLiveの指定
public void publish(javax.jms.Topic topic, javax.jms.Message message, oracle.jms.AQjmsAgent[] recipient_list, int deliveryMode, int priority, long timeToLive) throws JMSException
このメソッドは、配信モード、優先順位およびTimeToLive
を指定してメッセージをパブリッシュします。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
メッセージのパブリッシュ先のトピック( |
|
パブリッシュするメッセージ。 |
|
メッセージがパブリッシュされる受信者のリスト。受信者の型は |
|
|
|
このメッセージの優先順位 |
|
ミリ秒で指定されるメッセージの保存時間(ゼロは無制限) |
例14-9 優先順位とTimeToLiveの指定によるパブリッシュ
TopicConnectionFactory tc_fact = null; TopicConnection t_conn = null; TopicSession jms_sess; TopicPublisher publisher1; 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( "OE", "Shipped_Orders_Topic"); publisher1 = jms_sess.createPublisher(shipped_orders); /* Create TextMessage */ TextMessage jms_sess.createTextMessage(); /* Publish message with priority 1 and time to live 200 seconds */ publisher1.publish(text_message, DeliveryMode.PERSISTENT, 1, 200000);
14.12 メッセージのパブリッシュ: 受信者リストの指定
public void publish(javax.jms.Message message, oracle.jms.AQjmsAgent[] recipient_list) throws JMSException
このメソッドは、トピック・サブスクライバをオーバーライドする受信者リストを指定して、メッセージをパブリッシュします。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
パブリッシュするメッセージ。 |
|
メッセージがパブリッシュされる受信者のリスト。受信者の型は |
例14-10 トピック・サブスクライバをオーバーライドする受信者リストの指定によるパブリッシュ
/* Publish specifying priority and timeToLive */ TopicConnectionFactory tc_fact = null; TopicConnection t_conn = null; TopicSession jms_sess; TopicPublisher publisher1; Topic shipped_orders; int myport = 5521; AQjmsAgent[] recipList; /* 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( "OE", "Shipped_Orders_Topic"); publisher1 = jms_sess.createPublisher(shipped_orders); /* create TextMessage */ TextMessage jms_sess.createTextMessage(); /* create two receivers */ recipList = new AQjmsAgent[2]; recipList[0] = new AQjmsAgent( "ES", "ES.shipped_orders_topic", AQAgent.DEFAULT_AGENT_PROTOCOL); recipList[1] = new AQjmsAgent( "WS", "WS.shipped_orders_topic", AQAgent.DEFAULT_AGENT_PROTOCOL); /* publish message specifying a recipient list */ publisher1.publish(text_message, recipList);
14.13 JMSトピックに対するDurableSubscriberの作成: セレクタの指定なし
public javax.jms.TopicSubscriber createDurableSubscriber( javax.jms.Topic topic, java.lang.String subs_name) throws JMSException
このメソッドは、セレクタ指定なしのJMSトピックにDurableSubscriberを作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
サブスクライブ先の非一時トピック |
|
このサブスクリプションの識別に使用される名前 |
トピックへの排他アクセス
CreateDurableSubscriber()
およびUnsubscribe()
は、どちらもターゲット・トピックに排他的にアクセスする必要があります。これらのコールが適用されるときに同じトピックに対する保留中のJMS send()
、publish()
またはreceive()
操作がある場合、例外ORA-4020が発生します。この問題を解決するには、次の2つの方法があります。
-
設定またはクリーン・アップのフェーズでの
createDurableSubscriber()
およびUnsubscribe()
のコールを、トピックに対して保留中の他のJMS操作がない場合に制限します。これによって、必要なリソースが他のJMS操作のコールによって保持されないようにできます。 -
createDurableSubscriber()
またはUnsubscribe()
をコールする前に、TopicSession.commit
をコールします。
例14-11 JMSトピックに対する永続サブスクライバの作成: セレクタの指定なし
TopicConnectionFactory tc_fact = null; TopicConnection t_conn = null; TopicSession jms_sess; TopicSubscriber subscriber1; Topic shipped_orders; int myport = 5521; AQjmsAgent[] recipList; /* 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( "OE", "Shipped_Orders_Topic"); /* create a durable subscriber on the shipped_orders topic*/ subscriber1 = jms_sess.createDurableSubscriber( shipped_orders, 'WesternShipping');
14.14 JMSトピックに対するDurableSubscriberの作成: セレクタの指定あり
public javax.jms.TopicSubscriber createDurableSubscriber( javax.jms.Topic topic, java.lang.String subs_name, java.lang.String messageSelector, boolean noLocal) throws JMSException
このメソッドは、セレクタを指定して、JMSトピックに対する永続サブスクライバを作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
サブスクライブ先の非一時トピック |
|
このサブスクリプションの識別に使用される名前 |
|
|
|
TRUEに設定すると、独自のコネクションによってパブリッシュされたメッセージの配信が禁止されます。 |
クライアントは、同一の名前および異なるmessageSelector
で永続トピック・サブスクライバを作成することによって、既存の永続サブスクリプションを変更できます。トピックのサブスクリプションを終了するには、unsubscribeコールが必要です。
関連項目:
例14-12 JMSトピックに対する永続サブスクライバの作成: セレクタの指定あり
TopicConnectionFactory tc_fact = null; TopicConnection t_conn = null; TopicSession jms_sess; TopicSubscriber subscriber1; Topic shipped_orders; int myport = 5521; AQjmsAgent[] recipList; /* 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( "OE", "Shipped_Orders_Topic"); /* create a subscriber */ /* with condition on JMSPriority and user property 'Region' */ subscriber1 = jms_sess.createDurableSubscriber( shipped_orders, 'WesternShipping', "JMSPriority > 2 and Region like 'Western%'", false);
14.15 Oracleオブジェクト型トピックに対するDurableSubscriberの作成: セレクタの指定なし
public javax.jms.TopicSubscriber createDurableSubscriber( javax.jms.Topic topic, java.lang.String subs_name, java.lang.Object payload_factory) throws JMSException
このメソッドは、セレクタを指定せずに、Oracleオブジェクト型のトピックに対する永続サブスクライバを作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
サブスクライブ先の非一時トピック |
|
このサブスクリプションの識別に使用される名前 |
|
Oracleのユーザー定義型にマップするJavaクラスの |
注意:
-
CustomDatum
は今後のリリースではサポートされなくなります。かわりに、ORADataFactory
ペイロード・ファクトリを使用してください。 -
シャード・キューは、オブジェクト型メッセージをサポートしていません。
関連項目:
例14-13 Oracleオブジェクト型トピックに対する永続サブスクライバの作成: セレクタの指定なし
/* Subscribe to an ADT queue */ TopicConnectionFactory tc_fact = null; TopicConnection t_conn = null; TopicSession t_sess = null; TopicSession jms_sess; TopicSubscriber subscriber1; Topic shipped_orders; int my[port = 5521; AQjmsAgent[] recipList; /* the java mapping of the oracle object type created by J Publisher */ ADTMessage message; /* 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( "OE", "Shipped_Orders_Topic"); /* create a subscriber, specifying the correct CustomDatumFactory */ subscriber1 = jms_sess.createDurableSubscriber( shipped_orders, 'WesternShipping', AQjmsAgent.getFactory());
14.16 Oracleオブジェクト型トピックに対するDurableSubscriberの作成: セレクタの指定あり
public javax.jms.TopicSubscriber createDurableSubscriber( javax.jms.Topic topic, java.lang.String subs_name, java.lang.String messageSelector, boolean noLocal, java.lang.Object payload_factory) throws JMSException
このメソッドは、セレクタを指定して、Oracleオブジェクト型のトピックに対する永続サブスクライバを作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
サブスクライブ先の非一時トピック |
|
このサブスクリプションの識別に使用される名前 |
|
|
|
TRUEに設定すると、独自のコネクションによってパブリッシュされたメッセージの配信が禁止されます。 |
|
Oracleのユーザー定義型にマップするJavaクラスの |
注意:
-
CustomDatum
は今後のリリースではサポートされなくなります。かわりに、ORADataFactory
ペイロード・ファクトリを使用してください。 -
シャード・キューは、オブジェクト型メッセージをサポートしていません。
関連項目:
例14-14 Oracleオブジェクト型トピックに対する永続サブスクライバの作成: セレクタの指定あり
TopicConnectionFactory tc_fact = null; TopicConnection t_conn = null; TopicSession jms_sess; TopicSubscriber subscriber1; Topic shipped_orders; int myport = 5521; AQjmsAgent[] recipList; /* the java mapping of the oracle object type created by J Publisher */ ADTMessage message; /* 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( "OE", "Shipped_Orders_Topic"); /* create a subscriber, specifying correct CustomDatumFactory and selector */ subscriber1 = jms_sess.createDurableSubscriber( shipped_orders, "WesternShipping", "priority > 1 and tab.user_data.region like 'WESTERN %'", false, ADTMessage.getFactory());
14.17 トピック・サブスクライバ作成時の変換の指定
キュー/トピックにメッセージを送信/パブリッシュするときに変換を適用できます。メッセージを変換してからキュー/トピックに送信します。
変換は、AQjmsQueueSender
およびAQjmsTopicPublisher
のsetTransformation
インタフェースを使用して指定できます。
CreateDurableSubscriber()
コールを使用してトピック・サブスクライバを作成する場合も、変換を指定できます。取り出されたメッセージを変換してから、サブスクライバに戻します。指定されたサブスクライバがすでにCreateDurableSubscriber()
コールに存在する場合、その変換は指定した変換に設定されます。
例14-15 変換による宛先へのメッセージの送信
注文入力アプリケーションによって処理された注文情報をWS_bookedorders_topic
にパブリッシュする必要があると仮定します。正しいフォーマットでトピックにメッセージを挿入するには、前の項で定義した変換OE2WSを使用します。
public void ship_bookedorders( TopicSession jms_session, AQjmsADTMessage adt_message) { TopicPublisher publisher; Topic topic; try { /* get a handle to the WS_bookedorders_topic */ topic = ((AQjmsSession)jms_session).getTopic("WS", "WS_bookedorders_topic"); publisher = jms_session.createPublisher(topic); /* set the transformation in the publisher */ ((AQjmsTopicPublisher)publisher).setTransformation("OE2WS"); publisher.publish(topic, adt_message); } catch (JMSException ex) { System.out.println("Exception :" ex); } }
例14-16 トピック・サブスクライバ作成時の変換の指定
西部地域向け出荷処理アプリケーションは、変換OE2WS
とともにOE_bookedorders_topicにサブスクライブします。この変換はメッセージに適用され、Oracleオブジェクト型WS.WS_orders
のメッセージが戻されます。
WSOrder JavaクラスがJPublisherによって生成され、Oracleオブジェクト型WS.WS_order
にマップされると仮定します。:
public AQjmsAdtMessage retrieve_bookedorders(TopicSession jms_session) { TopicSubscriber subscriber; Topic topic; AQjmsAdtMessage msg = null; try { /* get a handle to the OE_bookedorders_topic */ topic = ((AQjmsSession)jms_session).getTopic("OE", "OE_bookedorders_topic"); /* create a subscriber with the transformation OE2WS */ subs = ((AQjmsSession)jms_session).createDurableSubscriber( topic, 'WShip', null, false, WSOrder.getFactory(), "OE2WS"); msg = subscriber.receive(10); } catch (JMSException ex) { System.out.println("Exception :" ex); } return (AQjmsAdtMessage)msg; }
14.18 リモート・サブスクライバの作成: JMSメッセージ
public void createRemoteSubscriber(javax.jms.Topic topic, oracle.jms.AQjmsAgent remote_subscriber, java.lang.String messageSelector) throws JMSException
このメソッドは、JMSメッセージ・トピックに対するリモート・サブスクライバを作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
サブスクライブ先のトピック。 |
|
リモート・サブスクライバを表す |
|
|
Oracle Database Advanced Queuingでは、トピックがリモート・サブスクライバ(同一または異なるデータベース内の他のトピックのサブスクライバ)を持つことができます。リモート・サブスクライバを使用するには、ローカル・トピックとリモート・トピック間の伝播を設定する必要があります。
リモート・サブスクライバは、リモート・トピックの特定のコンシューマまたはリモート・トピックのすべてのサブスクライバにできます。リモート・サブスクライバは、AQjmsAgent
構造を使用して定義されます。AQjmsAgent
は、名前およびアドレスで構成されます。名前は、リモート・トピックのconsumer_name
を参照します。アドレスはリモート・トピックを参照します。構文は、schema.topic_name[@dblink]
です。
リモート・トピックで特定のコンシューマに対してメッセージをパブリッシュするには、リモート・トピックでの受信者のsubscription_name
をAQjmsAgent
のnameフィールドに指定し、リモート・トピックをaddressフィールドに指定する必要があります。リモート・トピックのすべてのサブスクライバに対してメッセージをパブリッシュするには、AQjmsAgent
のnameフィールドをNULLに設定する必要があります。
注意:
シャード・キューは、リモート・サブスクライバをサポートしていません。
関連項目:
例14-17 リモート・サブスクライバの作成: JMS型メッセージ・トピック
TopicConnectionFactory tc_fact = null; TopicConnection t_conn = null; TopicSession t_sess = null; TopicSession jms_sess; TopicSubscriber subscriber1; Topic shipped_orders; int my[port = 5521; AQjmsAgent remoteAgent; /* 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( "OE", "Shipped_Orders_Topic"); remoteAgent = new AQjmsAgent("WesternRegion", "WS.shipped_orders_topic", null); /* create a remote subscriber (selector is null )*/ subscriber1 = ((AQjmsSession)jms_sess).createRemoteSubscriber( shipped_orders, remoteAgent, null);
14.19 リモート・サブスクライバの作成: Oracleオブジェクト型メッセージ
public void createRemoteSubscriber(javax.jms.Topic topic, oracle.jms.AQjmsAgent remote_subscriber, java.lang.String messageSelector, java.lang.Object payload_factory) throws JMSException
このメソッドは、Oracleオブジェクト型メッセージ・トピックに対するリモート・サブスクライバを作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
サブスクライブ先のトピック。 |
|
リモート・サブスクライバを表す |
|
|
|
Oracleのユーザー定義型にマップするJavaクラスの |
注意:
-
CustomDatum
は今後のリリースではサポートされなくなります。かわりに、ORADataFactory
ペイロード・ファクトリを使用してください。 -
シャード・キューは、リモート・サブスクライバおよびオブジェクト型メッセージをサポートしていません。
Oracle Database Advanced Queuingでは、トピックがリモート・サブスクライバ(同一または異なるデータベース内の他のトピックのサブスクライバ)を持つことができます。リモート・サブスクライバを使用するには、ローカル・トピックとリモート・トピック間の伝播を設定する必要があります。
リモート・サブスクライバは、リモート・トピックの特定のコンシューマまたはリモート・トピックのすべてのサブスクライバにできます。リモート・サブスクライバは、AQjmsAgent
構造を使用して定義されます。AQjmsAgent
は、名前およびアドレスで構成されます。名前は、リモート・トピックのconsumer_name
を参照します。アドレスはリモート・トピックを参照します。構文は、schema.topic_name[@dblink]
です。
リモート・トピックで特定のコンシューマに対してメッセージをパブリッシュするには、リモート・トピックでの受信者のsubscription_name
をAQjmsAgent
のnameフィールドに指定し、リモート・トピックをaddressフィールドに指定する必要があります。リモート・トピックのすべてのサブスクライバに対してメッセージをパブリッシュするには、AQjmsAgent
のnameフィールドをNULLに設定する必要があります。
注意:
AQは、宛先が同じである複数のdblinkの使用をサポートしていません。この問題を解決するには、各宛先に対し1つのデータベース・リンクを使用します。
関連項目:
例14-18 リモート・サブスクライバの作成: Oracleオブジェクト型メッセージ・トピック
TopicConnectionFactory tc_fact = null; TopicConnection t_conn = null; TopicSession t_sess = null; TopicSession jms_sess; TopicSubscriber subscriber1; Topic shipped_orders; int my[port = 5521; AQjmsAgent remoteAgent; ADTMessage message; /* create connection and session */ tc_fact = AQjmsFactory.getTopicConnectionFactory( "MYHOSTNAME", "MYSID", myport, "oci8"); t_conn = tc_fact.createTopicConnection("jmstopic", "jmstopic"); /* create TopicSession */ jms_sess = t_conn.createTopicSession(true, Session.CLIENT_ACKNOWLEDGE); /* get the Shipped order topic */ shipped_orders = ((AQjmsSession )jms_sess).getTopic( "OE", "Shipped_Orders_Topic"); /* create a remote agent */ remoteAgent = new AQjmsAgent("WesternRegion", "WS.shipped_orders_topic", null); /* create a remote subscriber with null selector*/ subscriber1 = ((AQjmsSession)jms_sess).createRemoteSubscriber( shipped_orders, remoteAgent, null, message.getFactory);
14.20 リモート・サブスクライバ作成時の変換の指定
Oracle Database Advanced Queuingによって、リモート・サブスクライバ(他のデータベースにあるサブスクライバ)をトピックにサブスクライブできます。
createRemoteSubscriber()
コールを使用してリモート・サブスクライバを作成する場合、変換を指定できます。これによって、異なるフォーマットのトピック間でメッセージを伝播できます。トピックに対してパブリッシュされたメッセージがリモート・サブスクライバの基準を満たしている場合、Oracle Database Advanced Queuingはリモート・サブスクライバに指定されているリモート・データベースにあるキュー/トピックにメッセージを自動的に伝播します。変換が指定される場合も、Oracle Database Advanced Queuingはその変換をメッセージに適用してからリモート・データベース上のキュー/トピックに伝播します。
注意:
シャード・キューは、リモート・サブスクライバをサポートしていません。
例14-19 リモート・サブスクライバ作成時の変換の指定
メッセージが自動的にWS.WS_bookedorders_topicに伝播されるようにリモート・サブスクライバをOE.OE_bookedorders_topicに作成します。変換OE2WSは、WS_bookedorders_topicに到達したメッセージが正しいフォーマットとなるように、リモート・サブスクライバを作成するときに指定します。
WSOrder JavaクラスがJPublisherによって生成され、Oracleオブジェクト型WS.WS_order
にマップされると仮定します。
public void create_remote_sub(TopicSession jms_session) { AQjmsAgent subscriber; Topic topic; try { /* get a handle to the OE_bookedorders_topic */ topic = ((AQjmsSession)jms_session).getTopic("OE", "OE_bookedorders_topic"); subscriber = new AQjmsAgent("WShip", "WS.WS_bookedorders_topic"); ((AQjmsSession )jms_session).createRemoteSubscriber( topic, subscriber, null, WSOrder.getFactory(),"OE2WS"); } catch (JMSException ex) { System.out.println("Exception :" ex); } }
14.21 永続サブスクリプションのサブスクライブの解除: ローカル・サブスクライバ
public void unsubscribe(javax.jms.Topic topic, java.lang.String subs_name) throws JMSException
このメソッドは、ローカル・サブスクライバについて永続サブスクリプションのサブスクライブを解除します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
サブスクライブ解除先の非一時トピック |
|
このサブスクリプションの識別に使用される名前 |
関連項目:
例14-20 永続サブスクリプションのサブスクライブの解除: ローカル・サブスクライバ
TopicConnectionFactory tc_fact = null; TopicConnection t_conn = null; TopicSession jms_sess; TopicSubscriber subscriber1; Topic shipped_orders; int myport = 5521; AQjmsAgent[] recipList; /* 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( "OE", "Shipped_Orders_Topic"); /* unsusbcribe "WesternShipping" from shipped_orders */ jms_sess.unsubscribe(shipped_orders, "WesternShipping");
14.22 永続サブスクリプションのサブスクライブの解除: リモート・サブスクライバ
public void unsubscribe(javax.jms.Topic topic, oracle.jms.AQjmsAgent remote_subscriber) throws JMSException
このメソッドは、リモート・サブスクライバについて永続サブスクリプションのサブスクライブを解除します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
サブスクライブ解除先の非一時トピック |
|
リモート・サブスクライバを表す |
注意:
シャード・キューは、リモート・サブスクライバをサポートしていません。
関連項目:
例14-21 永続サブスクリプションのサブスクライブの解除: リモート・サブスクライバ
TopicConnectionFactory tc_fact = null; TopicConnection t_conn = null; TopicSession t_sess = null; TopicSession jms_sess; Topic shipped_orders; int myport = 5521; AQjmsAgent remoteAgent; /* 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( "OE", "Shipped_Orders_Topic"); remoteAgent = new AQjmsAgent("WS", "WS.Shipped_Orders_Topic", null); /* unsubscribe the remote agent from shipped_orders */ ((AQjmsSession)jms_sess).unsubscribe(shipped_orders, remoteAgent);
14.23 TopicReceiverの作成: 標準JMS型メッセージ・トピック
public oracle.jms.AQjmsTopicReceiver createTopicReceiver( javax.jms.Topic topic, java.lang.String receiver_name, java.lang.String messageSelector) throws JMSException
このメソッドは、標準JMS型メッセージ・トピックに対するTopicReceiver
を作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
アクセスするトピック。 |
|
メッセージ・レシーバの名前。 |
|
|
Oracle Database Advanced Queuingでは、特定の受信者にメッセージを送信できます。これらの受信者は、トピックのサブスクライバである場合とそうでない場合があります。受信者がトピックに対するサブスクライバでない場合、明示的にアドレス指定されているメッセージのみを受信します。このメソッドは、永続サブスクライバ以外のコンシューマに対するTopicReceiver
オブジェクトの作成に使用する必要があります。
関連項目:
例14-22 TopicReceiverの作成: 標準JMS型メッセージ
TopicConnectionFactory tc_fact = null; TopicConnection t_conn = null; TopicSession t_sess = ull; TopicSession jms_sess; Topic shipped_orders; int myport = 5521; TopicReceiver receiver; /* 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"); receiver = ((AQjmsSession)jms_sess).createTopicReceiver( shipped_orders, "WesternRegion", null);
14.24 TopicReceiverの作成: Oracleオブジェクト型メッセージ・トピック
public oracle.jms.AQjmsTopicReceiver createTopicReceiver( javax.jms.Topic topic, java.lang.String receiver_name, java.lang.String messageSelector, java.lang.Object payload_factory) throws JMSException
このメソッドは、セレクタで、Oracleオブジェクト型メッセージ・トピックに対するTopicReceiver
を作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
アクセスするトピック。 |
|
メッセージ・レシーバの名前。 |
|
|
|
Oracleのユーザー定義型にマップするJavaクラスの |
注意:
-
CustomDatum
は今後のリリースではサポートされなくなります。かわりに、ORADataFactory
ペイロード・ファクトリを使用してください。 -
シャード・キューは、オブジェクト型メッセージをサポートしていません。
Oracle Database Advanced Queuingでは、トピックのすべてのサブスクライバ、または特定の受信者にメッセージを送信できます。これらの受信者は、トピックのサブスクライバである場合とそうでない場合があります。受信者がトピックに対するサブスクライバでない場合、明示的にアドレス指定されているメッセージのみを受信します。このメソッドは、永続サブスクライバ以外のコンシューマに対するTopicReceiver
オブジェクトの作成に使用する必要があります。
関連項目:
例14-23 TopicReceiverの作成: Oracleオブジェクト型メッセージ
TopicConnectionFactory tc_fact = null; TopicConnection t_conn = null; TopicSession t_sess = null; TopicSession jms_sess; Topic shipped_orders; int myport = 5521; TopicReceiver receiver; /* 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"); receiver = ((AQjmsSession)jms_sess).createTopicReceiver( shipped_orders, "WesternRegion", null);
14.25 TopicBrowserの作成: 標準JMSメッセージ
public oracle.jms.TopicBrowser createBrowser(javax.jms.Topic topic, java.lang.String cons_name, java.lang.String messageSelector) throws JMSException
このメソッドは、TextMessage
、StreamMessage
、ObjectMessage
、BytesMessage
またはMapMessage
メッセージ本体を使用するトピックに対するTopicBrowser
を作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
アクセスするトピック。 |
|
永続サブスクライバまたはコンシューマの名前。 |
|
|
|
Oracleのユーザー定義型にマップするJavaクラスの |
関連項目:
例14-24 TopicBrowserの作成: セレクタの指定なし
/* Create a browser without a selector */ TopicSession jms_session; TopicBrowser browser; Topic topic; browser = ((AQjmsSession) jms_session).createBrowser(topic, "SUBS1");
例14-25 TopicBrowserの作成: セレクタの指定あり
/* Create a browser for topics with a specified selector */ TopicSession jms_session; TopicBrowser browser; Topic topic; /* create a Browser to look at messages with correlationID = RUSH */ browser = ((AQjmsSession) jms_session).createBrowser( topic, "SUBS1", "JMSCorrelationID = 'RUSH'");
14.26 TopicBrowserの作成: 標準JMSメッセージ、メッセージのロック
public oracle.jms.TopicBrowser createBrowser(javax.jms.Topic topic, java.lang.String cons_name, java.lang.String messageSelector, boolean locked) throws JMSException
このメソッドは、Text、Stream、Objects、Bytesまたはマップ・メッセージを使用するトピックに対して、ブラウズ中にメッセージをロックするTopicBrowser
を作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
アクセスするトピック。 |
|
永続サブスクライバまたはコンシューマの名前。 |
|
|
|
TRUEに設定すると、ブラウズ中のメッセージはロックされます(UPDATEのSELECTと同様)。 |
例14-26 TopicBrowserの作成: セレクタの指定なし、ブラウズ中にメッセージをロック
/* Create a browser without a selector */ TopicSession jms_session; TopicBrowser browser; Topic topic; browser = ((AQjmsSession) jms_session).createBrowser( topic, "SUBS1", true);
例14-27 TopicBrowserの作成: セレクタの指定あり、メッセージをロック
/* Create a browser for topics with a specified selector */ TopicSession jms_session; TopicBrowser browser; Topic topic; /* create a Browser to look at messages with correlationID = RUSH in lock mode */ browser = ((AQjmsSession) jms_session).createBrowser( topic, "SUBS1", "JMSCorrelationID = 'RUSH'", true);
14.27 TopicBrowserの作成: Oracleオブジェクト型メッセージ
public oracle.jms.TopicBrowser createBrowser(javax.jms.Topic topic, java.lang.String cons_name, java.lang.String messageSelector, java.lang.Object payload_factory) throws JMSException
このメソッドは、Oracleオブジェクト型メッセージ・トピックに対するTopicBrowser
を作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
アクセスするトピック。 |
|
永続サブスクライバまたはコンシューマの名前。 |
|
|
|
Oracleのユーザー定義型にマップするJavaクラスの |
注意:
-
CustomDatum
は今後のリリースではサポートされなくなります。かわりに、ORADataFactory
ペイロード・ファクトリを使用してください。 -
シャード・キューは、オブジェクト型メッセージをサポートしていません。
SQLオブジェクト型ペイロードにマップされる特定のJavaクラスに対するCustomDatumFactory
は、静的メソッドgetFactory
を使用して取得できます。トピック test_topic
は、SCOTT.EMPLOYEE
型のペイロードを持ち、このOracleオブジェクト型に対してJpublisherによって生成されるJavaクラスがEmployee
であると仮定します。Employeeクラスは、CustomDatum
インタフェースを実装します。このクラスに対するCustomDatumFactory
は、Employee.getFactory()
メソッドを使用して取得できます。
関連項目:
例14-28 TopicBrowserの作成: AdtMessageメッセージ
/* Create a browser for a Topic with AdtMessage messages of type EMPLOYEE*/ TopicSession jms_session TopicBrowser browser; Topic test_topic; browser = ((AQjmsSession) jms_session).createBrowser( test_topic, "SUBS1", Employee.getFactory());
14.28 TopicBrowserの作成: Oracleオブジェクト型メッセージ、メッセージのロック
public oracle.jms.TopicBrowser createBrowser(javax.jms.Topic topic, java.lang.String cons_name, java.lang.String messageSelector, java.lang.Object payload_factory, boolean locked) throws JMSException
このメソッドは、Oracleオブジェクト型メッセージ・トピックに対して、ブラウズ中にメッセージをロックするTopicBrowser
を作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
アクセスするトピック。 |
|
永続サブスクライバまたはコンシューマの名前。 |
|
|
|
Oracleのユーザー定義型にマップするJavaクラスの |
|
TRUEに設定すると、ブラウズ中のメッセージはロックされます(UPDATEのSELECTと同様)。 |
注意:
-
CustomDatum
は今後のリリースではサポートされなくなります。かわりに、ORADataFactory
ペイロード・ファクトリを使用してください。 -
シャード・キューは、オブジェクト型メッセージをサポートしていません。
関連項目:
例14-29 TopicBrowserの作成: AdtMessageメッセージ、メッセージのロック
/* Create a browser for a Topic with AdtMessage messages of type EMPLOYEE* in lock mode/ TopicSession jms_session TopicBrowser browser; Topic test_topic; browser = ((AQjmsSession) jms_session).createBrowser( test_topic, "SUBS1", Employee.getFactory(), true);
14.29 TopicBrowserを使用したメッセージのブラウズ
public void purgeSeen() throws JMSException
このメソッドは、TopicBrowser
を使用してメッセージをブラウズします。java.util.Enumeration
内のメソッドを使用して、メッセージのリストを参照してください。現行のブラウズ中に参照したメッセージを削除するには、TopicBrowser
内のpurgeSeen
メソッドを使用してください。
例14-30 TopicBrowserの作成: セレクタの指定あり
/* Create a browser for topics with a specified selector */ public void browse_rush_orders(TopicSession jms_session) TopicBrowser browser; Topic topic; ObjectMessage obj_message BolOrder new_order; Enumeration messages; /* get a handle to the new_orders topic */ topic = ((AQjmsSession) jms_session).getTopic("OE", "OE_bookedorders_topic"); /* create a Browser to look at RUSH orders */ browser = ((AQjmsSession) jms_session).createBrowser( topic, "SUBS1", "JMSCorrelationID = 'RUSH'"); /* Browse through the messages */ for (messages = browser.elements() ; message.hasMoreElements() ;) {obj_message = (ObjectMessage)message.nextElement();} /* Purge messages seen during this browse */ browser.purgeSeen()