この章では、Oracle Streams Advanced Queuing(AQ)のJava Message Service(JMS)操作インタフェースのうち、パブリッシュ・サブスクライブ操作固有のコンポーネントについて説明します。Point-to-Pointおよびパブリッシュ・サブスクライブで共有されるコンポーネントについては、第15章「Oracle JMSの共有インタフェース」を参照してください。
内容は次のとおりです。
public javax.jms.Connection createConnection(
java.lang.String username,
java.lang.String password)
throws JMSException
このメソッドは、指定されたユーザー名とパスワードを使用して、Point-to-Point操作とパブリッシュ・サブスクライブ操作の両方をサポートするコネクションを作成します。これは新規メソッドで、JMSバージョン1.1仕様をサポートしています。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
username |
キュー用にデータベースに接続するユーザー名 |
password |
サーバーへの接続を作成するためのパスワード |
public javax.jms.Connection createConnection()
throws JMSException
このメソッドは、デフォルトのConnectionFactoryパラメータを使用して、Point-to-Point操作とパブリッシュ・サブスクライブ操作の両方をサポートするコネクションを作成します。これは新規メソッドで、JMSバージョン1.1仕様をサポートしています。ConnectionFactoryプロパティにデフォルトのユーザー名およびパスワードを含めないと、JMSExceptionが発生します。
public javax.jms.TopicConnection createTopicConnection(
java.lang.String username,
java.lang.String password)
throws JMSException
このメソッドは、指定されたユーザー名とパスワードを使用してTopicConnectionを作成します。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
username |
キュー用にデータベースに接続するユーザー名 |
password |
サーバーへの接続を作成するためのパスワード |
public static javax.jms.TopicConnection createTopicConnection(
java.sql.Connection jdbc_connection)
throws JMSException
このメソッドは、オープンしているJDBCコネクションを使用してTopicConnectionを作成します。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
jdbc_connection |
データベースへの有効なオープン・コネクション |
public static javax.jms.TopicConnection createTopicConnection(
oracle.jdbc.pool.OracleOCIConnectionPool cpool)
throws JMSException
このメソッドは、オープンしているOracleOCIConnectionPoolを使用してTopicConnectionを作成します。これは静的であり、次のパラメータを取ります。
| パラメータ | 説明 |
|---|---|
cpool |
データベースに対してオープンなOCIコネクション・プール |
public javax.jms.Session createSession(boolean transacted,
int ack_mode)
throws JMSException
このメソッドは、Point-to-Point操作とパブリッシュ・サブスクライブ操作の両方をサポートするSessionを作成します。これは新規で、JMSバージョン1.1仕様をサポートしています。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
transacted |
TRUEに設定すると、セッションはトランザクションになります。 |
ack_mode |
コンシューマまたはクライアントが受信したメッセージを認識するかどうかを示します。トランザクション処理のセッションの場合は無視されます。有効な値はSession.AUTO_ACKNOWLEDGE、Session.CLIENT_ACKNOWLEDGEおよびSession.DUPS_OK_ACKNOWLEDGEです。 |
public javax.jms.TopicSession createTopicSession(boolean transacted,
int ack_mode)
throws JMSException
このメソッドはTopicSessionを作成します。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
transacted |
TRUEに設定すると、セッションはトランザクションになります。 |
ack_mode |
コンシューマまたはクライアントが受信したメッセージを認識するかどうかを示します。トランザクション処理のセッションの場合は無視されます。有効な値はSession.AUTO_ACKNOWLEDGE、Session.CLIENT_ACKNOWLEDGEおよびSession.DUPS_OK_ACKNOWLEDGEです。 |
public javax.jms.TopicPublisher createPublisher(javax.jms.Topic topic)
throws JMSException
このメソッドはTopicPublisherを作成します。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
topic |
パブリッシュ対象のトピック。識別されていないプロデューサの場合は、NULL。 |
public void publish(javax.jms.Message message)
throws JMSException
このメソッドは、最小限の指定でメッセージをパブリッシュします。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
message |
送信するメッセージ |
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);
public void publish(javax.jms.Topic topic, javax.jms.Message message)
throws JMSException
このメソッドは、トピックを指定してメッセージをパブリッシュします。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
topic |
パブリッシュするトピック |
message |
送信するメッセージ |
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);
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を指定してメッセージをパブリッシュします。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
topic |
メッセージのパブリッシュ先のトピック(MessageProducerのデフォルト・トピックをオーバーライドします)。 |
message |
パブリッシュするメッセージ。 |
recipient_list |
メッセージがパブリッシュされる受信者のリスト。受信者の型はAQjmsAgentです。 |
deliveryMode |
PERSISTENTまたはNON_PERSISTENT(このリリースでサポートされているのはPERSISTENTのみです)。 |
priority |
このメッセージの優先順位 |
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);
public void publish(javax.jms.Message message,
oracle.jms.AQjmsAgent[] recipient_list)
throws JMSException
このメソッドは、トピック・サブスクライバをオーバーライドする受信者リストを指定して、メッセージをパブリッシュします。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
message |
パブリッシュするメッセージ。 |
recipient_list |
メッセージがパブリッシュされる受信者のリスト。受信者の型はAQjmsAgentです。 |
例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);
public javax.jms.TopicSubscriber createDurableSubscriber(
javax.jms.Topic topic,
java.lang.String subs_name)
throws JMSException
このメソッドは、セレクタ指定なしのJMSトピックにDurableSubscriberを作成します。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
topic |
サブスクライブ先の非一時トピック |
subs_name |
このサブスクリプションの識別に使用される名前 |
トピックへの排他アクセス
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');
public javax.jms.TopicSubscriber createDurableSubscriber(
javax.jms.Topic topic,
java.lang.String subs_name,
java.lang.String messageSelector,
boolean noLocal)
throws JMSException
このメソッドは、セレクタを指定して、JMSトピックに対する永続サブスクライバを作成します。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
topic |
サブスクライブ先の非一時トピック |
subs_name |
このサブスクリプションの識別に使用される名前 |
messageSelector |
messageSelector式と一致したプロパティを持つメッセージのみが配信されます。NULL値または空の文字列は、メッセージ・コンシューマに対するmessageSelectorがないことを表します。 |
noLocal |
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);
public javax.jms.TopicSubscriber createDurableSubscriber(
javax.jms.Topic topic,
java.lang.String subs_name,
java.lang.Object payload_factory)
throws JMSException
このメソッドは、セレクタを指定せずに、Oracleオブジェクト型のトピックに対する永続サブスクライバを作成します。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
topic |
サブスクライブ先の非一時トピック |
subs_name |
このサブスクリプションの識別に使用される名前 |
payload_factory |
Oracleのユーザー定義型にマップするJavaクラスのCustomDatumFactoryまたはORADataFactory |
|
注意: 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());
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オブジェクト型のトピックに対する永続サブスクライバを作成します。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
topic |
サブスクライブ先の非一時トピック |
subs_name |
このサブスクリプションの識別に使用される名前 |
messageSelector |
messageSelector式と一致したプロパティを持つメッセージのみが配信されます。NULL値または空の文字列は、メッセージ・コンシューマに対するmessageSelectorがないことを表します。 |
noLocal |
TRUEに設定すると、独自のコネクションによってパブリッシュされたメッセージの配信が禁止されます。 |
payload_factory |
Oracleのユーザー定義型にマップするJavaクラスのCustomDatumFactoryまたはORADataFactory |
|
注意: 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());
キュー/トピックにメッセージを送信/パブリッシュするときに変換を適用できます。メッセージを変換してからキュー/トピックに送信します。
変換は、AQjmsQueueSenderおよびAQjmsTopicPublisherのsetTransformationインタフェースを使用して指定できます。
例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);
}
}
CreateDurableSubscriber()コールを使用してトピック・サブスクライバを作成する場合も、変換を指定できます。取り出されたメッセージを変換してから、サブスクライバに戻します。指定されたサブスクライバがすでにCreateDurableSubscriber()コールに存在する場合、その変換は指定した変換に設定されます。
例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;
}
public void createRemoteSubscriber(javax.jms.Topic topic,
oracle.jms.AQjmsAgent remote_subscriber,
java.lang.String messageSelector)
throws JMSException
このメソッドは、JMSメッセージ・トピックに対するリモート・サブスクライバを作成します。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
topic |
サブスクライブ先のトピック。 |
remote_subscriber |
リモート・サブスクライバを表すAQjmsAgent。 |
messageSelector |
messageSelector式と一致したプロパティを持つメッセージのみが配信されます。NULL値または空の文字列は、メッセージ・コンシューマに対するmessageSelectorがないことを表します。 |
Oracle Streams 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);
public void createRemoteSubscriber(javax.jms.Topic topic,
oracle.jms.AQjmsAgent remote_subscriber,
java.lang.String messageSelector,
java.lang.Object payload_factory)
throws JMSException
このメソッドは、Oracleオブジェクト型メッセージ・トピックに対するリモート・サブスクライバを作成します。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
topic |
サブスクライブ先のトピック。 |
remote_subscriber |
リモート・サブスクライバを表すAQjmsAgent。 |
messageSelector |
messageSelector式と一致したプロパティを持つメッセージのみが配信されます。NULL値または空の文字列は、メッセージ・コンシューマに対するmessageSelectorがないことを表します。 |
payload_factory |
Oracleのユーザー定義型にマップするJavaクラスのCustomDatumFactoryまたはORADataFactory |
|
注意: CustomDatumは今後のリリースではサポートされなくなります。かわりに、ORADataFactoryペイロード・ファクトリを使用してください。 |
Oracle Streams Advanced Queuingでは、トピックがリモート・サブスクライバ(同一または異なるデータベース内の他のトピックのサブスクライバ)を持つことができます。リモート・サブスクライバを使用するには、ローカル・トピックとリモート・トピック間の伝播を設定する必要があります。
リモート・サブスクライバは、リモート・トピックの特定のコンシューマまたはリモート・トピックのすべてのサブスクライバにできます。リモート・サブスクライバは、AQjmsAgent構造を使用して定義されます。AQjmsAgentは、名前およびアドレスで構成されます。名前は、リモート・トピックのconsumer_nameを参照します。アドレスはリモート・トピックを参照します。構文は、schema.topic_name[@dblink]です。
リモート・トピックで特定のコンシューマに対してメッセージをパブリッシュするには、リモート・トピックでの受信者のsubscription_nameをAQjmsAgentのnameフィールドに指定し、リモート・トピックをaddressフィールドに指定する必要があります。リモート・トピックのすべてのサブスクライバに対してメッセージをパブリッシュするには、AQjmsAgentのnameフィールドをNULLに設定する必要があります。
例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);
|
注意: AQは、宛先が同じである複数のdblinkの使用をサポートしていません。この問題を解決するには、各宛先に対し1つのデータベース・リンクを使用します。 |
Oracle Streams Advanced Queuingによって、リモート・サブスクライバ(他のデータベースにあるサブスクライバ)をトピックにサブスクライブできます。
createRemoteSubscriber()コールを使用してリモート・サブスクライバを作成する場合、変換を指定できます。これによって、異なるフォーマットのトピック間でメッセージを伝播できます。トピックに対してパブリッシュされたメッセージがリモート・サブスクライバの基準を満たしている場合、Oracle Streams Advanced Queuingはリモート・サブスクライバに指定されているリモート・データベースにあるキュー/トピックにメッセージを自動的に伝播します。変換が指定される場合も、Oracle Streams 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);
}
}
public void unsubscribe(javax.jms.Topic topic,
java.lang.String subs_name)
throws JMSException
このメソッドは、ローカル・サブスクライバについて永続サブスクリプションのサブスクライブを解除します。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
topic |
サブスクライブ解除先の非一時トピック |
subs_name |
このサブスクリプションの識別に使用される名前 |
例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");
public void unsubscribe(javax.jms.Topic topic,
oracle.jms.AQjmsAgent remote_subscriber)
throws JMSException
このメソッドは、リモート・サブスクライバについて永続サブスクリプションのサブスクライブを解除します。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
topic |
サブスクライブ解除先の非一時トピック |
remote_subscriber |
リモート・サブスクライバを表すAQjmsAgent。AQjmsAgentのアドレス・フィールドはNULLにできません。 |
例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);
public oracle.jms.AQjmsTopicReceiver createTopicReceiver(
javax.jms.Topic topic,
java.lang.String receiver_name,
java.lang.String messageSelector)
throws JMSException
このメソッドは、標準JMS型メッセージ・トピックに対するTopicReceiverを作成します。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
topic |
アクセスするトピック。 |
receiver_name |
メッセージ・レシーバの名前。 |
messageSelector |
messageSelector式と一致したプロパティを持つメッセージのみが配信されます。NULL値または空の文字列は、メッセージ・コンシューマに対するmessageSelectorがないことを表します。 |
Oracle Streams 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);
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を作成します。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
topic |
アクセスするトピック。 |
receiver_name |
メッセージ・レシーバの名前。 |
messageSelector |
messageSelector式と一致したプロパティを持つメッセージのみが配信されます。NULL値または空の文字列は、メッセージ・コンシューマに対するmessageSelectorがないことを表します。 |
payload_factory |
Oracleのユーザー定義型にマップするJavaクラスのCustomDatumFactoryまたはORADataFactory |
|
注意: CustomDatumは今後のリリースではサポートされなくなります。かわりに、ORADataFactoryペイロード・ファクトリを使用してください。 |
Oracle Streams 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);
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を作成します。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
topic |
アクセスするトピック。 |
cons_name |
永続サブスクライバまたはコンシューマの名前。 |
messageSelector |
messageSelector式と一致したプロパティを持つメッセージのみが配信されます。NULL値または空の文字列は、メッセージ・コンシューマに対するmessageSelectorがないことを表します。 |
payload_factory |
Oracleのユーザー定義型にマップするJavaクラスのCustomDatumFactoryまたはORADataFactory |
例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'");
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を作成します。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
topic |
アクセスするトピック。 |
cons_name |
永続サブスクライバまたはコンシューマの名前。 |
messageSelector |
messageSelector式と一致したプロパティを持つメッセージのみが配信されます。NULL値または空の文字列は、メッセージ・コンシューマに対するmessageSelectorがないことを表します。 |
locked |
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);
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を作成します。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
topic |
アクセスするトピック。 |
cons_name |
永続サブスクライバまたはコンシューマの名前。 |
messageSelector |
messageSelector式と一致したプロパティを持つメッセージのみが配信されます。NULL値または空の文字列は、メッセージ・コンシューマに対するmessageSelectorがないことを表します。 |
payload_factory |
Oracleのユーザー定義型にマップするJavaクラスのCustomDatumFactoryまたはORADataFactory |
|
注意: CustomDatumは今後のリリースではサポートされなくなります。かわりに、ORADataFactoryペイロード・ファクトリを使用してください。 |
SQLオブジェクト型ペイロードにマップされる特定のJavaクラスに対するCustomDatumFactoryは、静的メソッドgetFactoryを使用して取得できます。トピックtest_topicは、SCOTT.EMPLOYEE型のペイロードを持ち、このOracleオブジェクト型に対してJPublisherによって生成されるJavaクラスがEmployeeであると仮定します。Employeeクラスは、CustomDatumインタフェースを実装します。このクラスに対するCustomDatumFactoryは、Employee.getFactory()メソッドを使用して取得できます。
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を作成します。次のパラメータがあります。
| パラメータ | 説明 |
|---|---|
topic |
アクセスするトピック。 |
cons_name |
永続サブスクライバまたはコンシューマの名前。 |
messageSelector |
messageSelector式と一致したプロパティを持つメッセージのみが配信されます。NULL値または空の文字列は、メッセージ・コンシューマに対するmessageSelectorがないことを表します。 |
payload_factory |
Oracleのユーザー定義型にマップするJavaクラスのCustomDatumFactoryまたはORADataFactory |
locked |
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);
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()