7 AQ用のOracle JCAアダプタ
Oracle JCA Adapter for AQ (Oracle AQアダプタ)を使用して、Oracle BPEL Process Manager (Oracle BPEL PM)またはOracle Mediatorによるシングル・コンシューマまたはマルチ・コンシューマ・キューの操作を可能にします。
7.1 Oracle AQアダプタの概要
Oracle Advanced Queuing (AQ)では、関連するアプリケーション間の双方向の非同期通信用に柔軟なメカニズムが提供されます。
アドバンスト・キューはOracleデータベースの機能であるため、高いスケーラビリティと信頼性を備えています。バックアップとリカバリ(Point-in-Timeリカバリも含む)、ロギング、トランザクション・サービスおよびシステム管理など、Oracleデータベースの他の機能もアドバンスト・キューによって継承されます。また、単一のアプリケーションを複数のキューで処理できるため、メッセージを様々な方法で分割したり、ロード・バランシングを介して別のレベルのスケーラビリティを提供したりできます。
Oracle AQの詳細は、Oracle Databaseアドバンスト・キューイング・ユーザーズ・ガイドを参照してください。
7.1.1 Oracle AQアダプタとOracle BPEL Process ManagerおよびOracle Mediatorの統合
JCA 1.5リソース・アダプタとOracle BPEL Process ManagerおよびOracle Mediatorを双方向で統合するために、JCAバインディング・コンポーネントが使用されています。JCAバインディング・コンポーネントは規格に準拠しており、基盤となるJCA相互作用をWebサービスとして公開するためのWeb Service Invocation Framework (WSIF)テクノロジが使用されています。
Oracle AQアダプタのアーキテクチャ、アダプタとOracle BPEL Process ManagerおよびOracle Mediatorの統合およびアダプタのデプロイの詳細は、アダプタとOracle Application Serverコンポーネントの統合を参照してください。
7.1.2 Oracle AQアダプタとOracle Mediatorの統合
メディエータ・サーバーはOracle AQアダプタをサポートしており、それぞれのインバウンドおよびアウトバウンドのアダプタ・サービスを定義できます。インバウンド・アダプタ・サービスでは、Oracle AQアダプタからデータが受信されてXMLメッセージに変換されます。アウトバウンド・アダプタ・サービスでは、XMLメッセージが特定のアダプタのネイティブ・フォーマットに変換され、データがターゲット・アプリケーションに送信されます。
メディエータ・サーバーを使用すると、Oracle Advanced Queuingのシングル・コンシューマ・キューまたはマルチ・コンシューマ・キューとの間でメッセージを送受信できます。
ノート:
メディエータはOracle BPEL PMの後継であり、このガイドのほとんどの部分は、Oracle BPEL PMを使用することを想定しています。ただし、Oracle AQアダプタの動作はOracle BPEL PMでもメディエータでも同じです。ここでOracle BPEL PMに言及している箇所は、メディエータで置き換えてかまいません。
7.2 Oracle AQアダプタの機能
Oracle AQアダプタは、AQメッセージのプロデューサでもありコンシューマでもあります。エンキュー操作は、JCAアウトバウンド相互作用として公開されています。デキュー操作は、JCAインバウンド相互作用として公開されています。
Oracle AQアダプタでは、ペイロードとしてADT (Oracleオブジェクト・タイプ)、XMLType
およびRAW
キューをサポートしています。また、1つのADTメンバー列からのペイロードの抽出もサポートしています。
Oracle AQアダプタでは、エンキューおよびデキュー操作用として正規化されたプロパティがサポートされています。
Oracle AQアダプタでサポートされているプロパティの詳細は、「Oracle AQアダプタのプロパティ」を参照してください。
7.2.1 エンキュー固有の機能(メッセージ生成)
Oracle AQアダプタでは、Oracle Streams AQの次の機能をサポートしています。
-
相関識別子
アダプタ構成ウィザードでは、特定メッセージの取得に使用するエンキュー操作の定義時に相関識別子を指定できます。
-
マルチ・コンシューマ・キュー
Oracle Streams AQでは、複数のコンシューマで1つのメッセージの処理と消費を実行できます。この機能を使用するには、マルチ・コンシューマ・キューを作成し、そのキューにメッセージをエンキューする必要があります。この構成では、デフォルトのサブスクリプション・リストまたはオーバーライド受信者リストのいずれかを使用して、単一のメッセージが複数のAQコンシューマによって消費(デキュー操作)されます。このシナリオでは、指定したすべてのコンシューマ・エージェントによって消費されるまで、メッセージはキューに残ります。Oracle AQアダプタのエンキュー・ヘッダー・プロパティ(
jca.aq.RecipientList
)を使用すると、キューからのメッセージ取得が可能なオーバーライド受信者リスト(カンマ区切りの文字列値)を指定できます。サブスクライバとしてマルチ・コンシューマ・キューに追加されたすべてのコンシューマでは、Recipient
パラメータに一意の値が必要です。2つのサブスクライバでNAME
、ADDRESS
およびPROTOCOL
属性に同じ値を使用することはできません。 -
メッセージの優先度
エンキュー済のメッセージに優先度を指定すると、メッセージは優先度に従ってデキューされます。2つのメッセージの優先度が同じ場合、デキューの順番はエンキュー時間で決定されます。また、メッセージのソート順としてエンキュー時間の優先度を指定することで、優先度が格納順の取出し(FIFO)のキューを作成することもできます。この優先度は、Oracle AQアダプタのエンキュー・ヘッダーのプロパティです。エンキュー時間は、基礎となるAQアプリケーションによって自動的に設定されます。
次に、FIFOキューの作成方法の例を示します。
EXECUTE DBMS_AQADM.CREATE_QUEUE_TABLE( \ queue_table => 'OE_orders_pr_mqtab', \ sort_list =>'priority,enq_time', \ comment => 'Order Entry Priority \ MultiConsumer Orders queue table',\ multiple_consumers => TRUE, \ queue_payload_type => 'BOLADM.order_typ', \ compatible => '8.1', \ primary_instance => 2, \ secondary_instance => 1); EXECUTE DBMS_AQADM.CREATE_QUEUE ( \ queue_name => 'OE_bookedorders_que', \ queue_table => 'OE_orders_pr_mqtab');
-
時間の指定とスケジュール
Oracle Streams AQでは、遅延間隔と有効期限の間隔を指定できます。遅延間隔は、メッセージのエンキュー後に、エンキュー済のメッセージがデキュー元で使用可能とマークされる時期を決定します。遅延時間の設定されたメッセージがエンキューされると、メッセージは
WAIT
状態とマークされます。WAIT
状態のメッセージは、デフォルトのデキュー・コールからマスクされます。有効期限のプロパティは有効期限の指定に使用され、メッセージが有効期限の前に消費されない場合、メッセージは自動的に例外キューに移動されます。
7.2.2 デキューおよびエンキューの機能
Oracle Streams AQには、次のデキュー・オプションがあります。
-
ポーリング・オプション
-
通知オプション
ポーリング・オプションは、着信の都度のメッセージの処理や、メッセージの継続的なポーリングに関連します。Oracle AQアダプタでは、AQメッセージ消費のポーリング・メカニズムをサポートしています。
Oracle AQアダプタでは、Oracle Streams AQの次の機能をサポートしています。
-
マルチ・コンシューマ・キュー
Oracle AQアダプタは、マルチ・コンシューマ・キューからメッセージを取得できます。
-
デキュー処理用のメッセージの移動
メッセージをエンキューと同じ順序でデキューする必要はありません。相関識別子を使用してデキューの順序を指定できます。アダプタ構成ウィザードで、デキュー操作の相関IDを定義できます。
-
遅延を伴う再試行
再試行回数は、Oracle AQアダプタのデキュー・ヘッダーのプロパティです。再試行回数が制限を超えると、メッセージは指定の例外キューに移動されます。この例外キューは、Oracle AQアダプタのエンキュー・ヘッダーのプロパティです。
-
ルールベースのサブスクリプション
Oracle Streams AQでは、コンテンツベースおよびサブジェクトベースのメッセージのフィルタ処理が可能です。ルールには、そのルールに一致するメッセージのサブスクライブを目的とした1つ以上のコンシューマが定義されます。サブジェクトベースのルールの場合、SQL問合せの
WHERE
句に似た構文を使用してブール式を指定します。このブール式には、メッセージ・プロパティの条件(現状では優先度と相関ID)、ユーザー・データ・プロパティ(オブジェクト・ペイロードのみ)および関数(SQL問合せのWHERE
句の指定と同様)を含めることができます。マルチ・コンシューマ・キューへのルール・ベースのサブスクリプションの作成例は、「デキュー中のメッセージのフィルタ処理に対するメッセージ・セレクタ・ルールの使用」を参照してください。
-
Oracle AQアダプタのヘッダー・プロパティ
Oracle AQアダプタのヘッダー・プロパティの詳細は、「Oracle AQアダプタのプロパティ」を参照してください。
-
デキュー条件
デキュー条件は、Oracle AQアダプタで使用されるアドバンスト・キューイング製品の機能です。デキュー条件が指定され、指定された条件を満たすメッセージがない場合は、デキューが実行されません。
デキュー条件要素は、SQL問合せの
WHERE
句に似た構文を使用するブール式です。このブール式には、メッセージ・プロパティ、ユーザー・オブジェクトのペイロード・データ・プロパティおよびPL/SQLまたはSQL関数に関する条件を含めることができます。メッセージ・プロパティには、priority
、corrid
およびキュー表の他の列などがあります。マルチ・サブスクライバ・キューでデキューが実行される際には、メッセージを選別して特定の条件を満たすもののみを着信することが必要な場合があります。これらの条件は、優先度1のメッセージのみを選択する場合などはヘッダー情報に、$100,000を超えるローン・アプリケーションのみを選択する場合などはメッセージ・ペイロードの一部に関係します。
マルチ・サブスクライバ・キューを選択した場合は、「メッセージ・セレクタ・ルール」フィールドが「Oracle AQアダプタ・サービスの定義」のステップ11に表示されます。
priority = 1
またはTAB.USER_DATA.amount > 1000
など、SQLのWHERE
句に似た構文を使用したブール式でサブスクリプション・ルールを入力します。アダプタにより、このブール式がtrueのメッセージのみがデキューされます。ノート:
MessageSelectorRule
は、ネストされた問合せをサポートするためにDequeueCondition
と組み合せて使用できます。マルチ・コンシューマ・キューへのルール・ベースのサブスクリプションの作成例は、「デキュー中のメッセージのフィルタ処理に対するメッセージ・セレクタ・ルールの使用」を参照してください。ヘッダー情報にアクセスするには、「ペイロード以外のフィールドへのアクセスも必要」チェック・ボックスを選択する必要があります。
このチェック・ボックスを選択すると、生成されるWSDLファイルの
type
セクションにコードが追加されます。<?xml version = '1.0' encoding = 'UTF-8'?> <?binding.jca Inbound_aq.jca?> <definitions name="Inbound" targetNamespace="http://xmlns.oracle. com/pcbpel/adapter/aq/Inbound/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://xmlns.oracle.com/pcbpel/adapter/aq/Inbound/" xmlns:plt="http://schemas.xmlsoap.org/ws/2003/05/partner-link/" xmlns:obj1="http://xmlns.oracle.com/xdb/SCOTT" xmlns:imp1="http://www.oracle.com/ipdemo"> <types> <schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://xmlns.oracle.com/pcbpel/adapter/aq/Inbound/" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://xmlns.oracle.com/pcbpel/adapter/aq/Inbound/" xmlns:hdr="http://xmlns.oracle.com/pcbpel/adapter/aq/inbound/" xmlns:obj1="http://xmlns.oracle.com/xdb/SCOTT"> <import namespace="http://xmlns.oracle.com/xdb/SCOTT" schemaLocation="xsd/SCOTT_MAGAZINE_TYPE.xsd"/> <import namespace="http://xmlns.oracle.com/pcbpel/adapter/aq/inbound/" schemaLocation="xsd/aqAdapterInboundHeader.xsd"/> <complexType name="HeaderCType"> <sequence> <element name="QueueHeader" type="hdr:HeaderType"/> <element name="PayloadHeader" type="obj1:MAGAZINE_TYPE"/> </sequence> </complexType> <element name="Header" type="tns:HeaderCType"/> </schema> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <import namespace="http://www.oracle.com/ipdemo" schemaLocation="xsd/simpleMagazine.xsd"/> </schema> </types> <message name="simpleMagazine_msg"> <part name="simpleMagazine" element="imp1:simpleMagazine"/> </message> <message name="Header_msg"> <part name="Header" element="tns:Header"/> </message> <portType name="Dequeue_ptt"> <operation name="Dequeue"> <input message="tns:simpleMagazine_msg"/> </operation> </portType> <plt:partnerLinkType name="Dequeue_plt"> <plt:role name="Dequeue_role"> <plt:portType name="tns:Dequeue_ptt"/> </plt:role> </plt:partnerLinkType> </definitions>
PayloadHeader
は、キューのADT全体のタイプであることに注意してください。ペイロードには選択したペイロード・フィールドのみが含まれます。「ペイロード以外のフィールドへのアクセスも必要」を選択した場合、PayloadHeader
(. jca.aq.HeaderDocument
)にはADT全体が含まれます(ヘッダーにも存在しアダプタでは無視されるペイロード・フィールドも含まれます)。
Oracle AQアダプタのアーキテクチャ、アダプタとOracle BPEL Process ManagerおよびOracle Mediatorの統合およびアダプタのデプロイの詳細は、「Oracle JCAアダプタの概要」を参照してください。
7.2.3 同期リクエスト/レスポンス
AQアダプタ構成ウィザードを使用すると、Oracle AQアダプタを同期リクエスト/レスポンス相互作用パターンに使用できるプロセスをモデル化できます。
このシナリオでは、Oracle AQアダプタはリクエスト・キューにリクエストを送信し、リプライ・キューからのレスポンスを待ってから実行を継続します。内部では、Oracle AQアダプタにより新規の相互作用パターンAQRequestReplyInteractionSpec
が使用されます。この相互作用の仕様では、リクエストとリプライの宛先名を構成できます。
バリエーションにより、リプライ・キューの一部として一時的な宛先を使用できます。その後、アダプタはAQReplyTo
ヘッダーをリプライの宛先に設定します。
7.2.4 同期デキュー
AQの「操作タイプ」ページで「同期デキュー」操作タイプを選択して、AQアダプタのアウトバウンド同期デキューを構成できます。
7.2.4.2 同期リクエスト/リプライのJCAファイル
次の項では、同期リクエスト/リプライと同期デキューの両方のファイル・アーティファクトを指定します。次の例では、同期リクエスト/リプライ・シナリオのjcaファイルを示します。
<adapter-config name="AQService" adapter="AQ" wsdlLocation="../WSDLs/AQRequestReply.wsdl" xmlns="http://platform.integration.oracle/blocks/adapter/fw/metadata"> <connection-factory location="eis/AQ/slc01gid" UIConnectionName="slc01gid"/> <endpoint-interaction portType="Enqueue_Dequeue_ptt" operation="Enqueue_Dequeue" UITransmissionPrimitive="Request-response"> <interaction-spec className="oracle.tip.adapter.aq.v2.jca.AQRequestReplyInteractionSpec"> <property name="EnqueueQueue" value="EDN_OAOO_QUEUE"/> <property name="RecipientList" value="recp1"/> <property name="DequueQueue" value="EDN_EVENT_QUEUE"/> <property name="ObjectFieldName" value="PAYLOAD"/> <property name="Consumer" value="cons1"/> </interaction-spec> </endpoint-interaction> </adapter-config>
7.2.4.3 同期デキューのJCAファイル
次の例では、同期デキュー・シナリオのjcaファイルを示します。
<adapter-config name="AQSyncDequeue" adapter="AQ" wsdlLocation="../WSDLs/AQSyncDequeue.wsdl" xmlns="http://platform.integration.oracle/blocks/adapter/fw/metadata"> <connection-factory location="eis/AQ/slc01gid" UIConnectionName="slc01gid"/> <endpoint-interaction portType="Sync_Dequeue_ptt" operation="Sync_Dequeue"> <interaction-spec className="oracle.tip.adapter.aq.v2.jca.AQReceiveNoWaitInteractionSpec"> <property name="Consumer" value="cons1"/> <property name="SchemaValidation" value="false"/> <property name="QueueName" value="EDN_OAOO_QUEUE"/> <property name="ObjectFieldName" value="PAYLOAD"/> </interaction-spec> </endpoint-interaction> </adapter-config>
7.2.5 サポートされているADTペイロード・タイプ
Oracle AQアダプタでは、次のRAW
タイプをサポートしています。
-
BLOB
-
CHAR
-
CLOB
-
DATE
-
DECIMAL
-
DOUBLE PRECISION
-
FLOAT
-
INTEGER
-
NUMBER
-
REAL
-
SMALLINT
-
TIMESTAMP
-
VARCHAR2
前述のリストに示したRAW
タイプ以外にも、Oracle AQアダプタは、プリミティブ型およびオブジェクトの配列もサポートしています。
ノート:
現在、Oracle AQアダプタは、ADT列のTIMESTAMP WITH LOCAL TIMEZONE
データ型およびTIMESTAMP WITH TIMEZONE
データ型に対応していません。
ADT全体ではなくペイロード・フィールドを選択する場合は、ペイロード・フィールドとして次のデータ型の1つを選択します。
-
CLOB
(XSDまたは不透明(Opaque)スキーマのいずれか) -
VARCHAR2
(XSDまたは不透明(Opaque)スキーマのいずれか) -
BLOB
(不透明(Opaque)スキーマのみ) -
XMLTYPE
(XSDまたは不透明(Opaque)スキーマのいずれか)
7.2.6 ネイティブ・フォーマット・ビルダー・ウィザード
Oracle JDeveloperのネイティブ・フォーマット・ビルダー・ウィザードを使用して、AQ RAW
ペイロード用のファイルを含む様々なフォーマットのXSD
ファイルを定義できます。
ネイティブ・フォーマット・ビルダー・ウィザードの詳細は、ネイティブ・フォーマット・ビルダー・ウィザードを参照してください。
ペイロード・スキーマ
ペイロード・スキーマはペイロード・タイプに依存します。ADT全体の場合、スキーマはアダプタ構成ウィザードによって完全に生成されます。ペイロードとしてBLOB
が選択されたADTの場合、次のように定義された不透明(Opaque)スキーマを使用する必要があります。
<element name="opaqueElement" type="base64Binary" />
その他すべての場合には、表7-1に示すように、スキーマを指定するか不透明(Opaque)スキーマを使用できます。
表7-1 ペイロード・スキーマ
ペイロード・タイプ | サポートされているスキーマ |
---|---|
|
ユーザー指定のスキーマまたは不透明(Opaque)スキーマ。 |
|
アダプタ構成ウィザードによって生成された、キュー構造に基づくスキーマを使用する必要があります。 |
ペイロードとして |
ユーザー指定のスキーマまたは不透明(Opaque)スキーマ。 |
ユーザー指定のスキーマまたは不透明(Opaque)スキーマのペイロードとして |
ユーザー指定のスキーマまたは不透明(Opaque)スキーマ。 |
不透明(Opaque)スキーマのペイロードとして |
不透明(Opaque)スキーマ。 |
|
ユーザー指定のスキーマまたは不透明(Opaque)スキーマ。 |
XSDファイルはないがペイロード・データが(カンマ区切り値(CSV)形式などで)書式設定されている場合は、ネイティブ・フォーマット・ビルダー・ウィザードを使用して適切なXSDを生成できます。アダプタ構成ウィザードは、ネイティブ・フォーマット・ビルダー・ウィザードと統合されています。「アダプタ構成ウィザード - メッセージ」ウィンドウで、「ネイティブ・フォーマットのスキーマの定義」をクリックしてネイティブ・フォーマット・ビルダー・ウィザードにアクセスします。
7.2.7 正規化されたメッセージのサポート
ヘッダーの操作と伝播は、重要なビジネス統合メッセージング要件です。Oracle BPEL PM、メディエータ、Oracle JCAおよびB2Bは、顧客の統合ニーズを解決する上でヘッダー・サポートに大きく依存しています。たとえば、メッセージ・ヘッダーを介してファイル名を伝播することで、そのファイル名をソース・ディレクトリからターゲット・ディレクトリに保存できます。Oracle BPEL PMとメディエータでは、様々なUIサポート・レベルでヘッダーにアクセスし、操作して設定できます。
ノート:
リリース10.1.3でサポートされているAQアダプタのインバウンド・ヘッダーとアウトバウンド・ヘッダーは、リリース11gでは正規化されたメッセージ・プロパティを介してサポートされています。
詳細は、「アダプタ内での相関サポート」を参照してください。
正規化されたメッセージのヘッダーの伝播
正規化されたメッセージは、プロパティとペイロードという2つの部分のみを持つように簡素化されています。通常、プロパティはスカラー型の名前-値のペアです。既存の複雑なヘッダーをプロパティに合せるために、プロパティはスカラー型にフラット化されています。
設計時のヘッダーの操作
複雑なプロパティは事前に決定されているため、設計時にヘッダーを操作する際のユーザー操作は合理化されています。メディエータまたはBPELデザイナでは、なんらかの予約済キーワードを使用してヘッダーを操作できます。たとえば、現在、メディエータでは、次の式を使用してインバウンド・ファイル・アダプタのfileName
ヘッダーにアクセスできます:
$nmproperty.InboundFileHeaderType.fileName
ただし、この方法はユーザー入力に基づいて動的に生成されるプロパティに対処していません。たとえば、AQアダプタ・ウィザードでは、AQオブジェクトからの一部のフィールドをヘッダーとして伝播できます。選択内容に基づいてヘッダーが定義されます。これらの定義はあらかじめ決まらないため、あらかじめ決められたプロパティ定義のリストでは対応できません。動的プロパティが定義される前に、動的プロパティのヘッダー操作を設計することはできません。この制限に対応するには、必要なすべてのサービス(コンポジット・エントリ・ポイント)と参照を生成する必要があります。この制約は、動的プロパティを生成することが想定されるサービスに適用されます。動的プロパティが生成された後、コンポジットごとに格納される必要があります。その後にのみ、メディエータまたはBPELデザイナで動的プロパティを操作できます。
正規化されたメッセージのライフサイクル中に伝播する必要のあるプロパティの識別
プロパティには、メッセージのライフサイクル全体にわたって伝播される必要があるものもあれば、伝播されてはいけないものもあります。伝播される必要があるプロパティは伝播可能プロパティと呼ばれ、伝播されてはいけないプロパティは伝播不可プロパティと呼ばれます。
7.2.8 DOM2準拠
Oracle AQアダプタはDocument Object Model Level 2 (DOM 2)に準拠しているため、AQアダプタではDOM2仕様に準拠する文書オブジェクトを生成できます。
7.2.9 メッセージ・サイズ対応
Oracle AQアダプタはメッセージ・サイズ対応です。つまり、Oracle AQアダプタではメッセージ・サイズが計算され、サイズがJCAバインディング・コンポーネントにレポートされます。JCAバインディング・コンポーネントにより公開されるサイズ関連APIは、レポート目的に使用できます。
7.2.10 複数の受信者スレッド
Oracle AQアダプタは、アクティブ化エンドポイント・プロパティadapter.aq.dequeue.threads
をサポートしています。アダプタとエンタープライズ情報システム(EIS)間のインバウンド・メッセージ・フロー用として複数のスレッドを生成するには、このプロパティを設定することをお薦めします。Oracle AQアダプタの以前のバージョンでは、複数のエンドポイントを開始するためにJCAバインディング・コンポーネントによって使用されていたactivationInstances
に依存していました。
7.2.11 DequeueTimeoutプロパティ
DequeueTimeOut
プロパティは、複数のインバウンド・デキュー・スレッドをサポートしています。このプロパティの値により、dequeue()
APIがメッセージを待機する秒数が決まります。この秒数が経過すると、このAPIが返されて次のポーリング・サイクルが開始されます。
次の例に示すように、このプロパティをcomposite.xml
ファイルに追加します。
<service name="Inbound" ui:wsdlLocation="Inbound.wsdl"> <interface.wsdl interface="http://xmlns.oracle.com/pcbpel/adapter/aq/AQ_InboundRetry_Mediator/AQ2JMSInboundRetry/Inbound%2F#wsdl.interface(Dequeue_ptt)"/> <binding.jca config="Inbound_aq.jca"> <property name="DequeueTimeOut" type="xs:integer" many="false"override="may">10 </property> </binding.jca> </service>
7.2.12 デキュー・タイムアウトおよび複数のインバウンド・ポーリング・スレッドの制御
Oracle AQアダプタには、プロセスごとではなくJava仮想マシン(JVM)ごとにシステム全体単位でデキュー・タイムアウトおよび複数のインバウンド・ポーリング・スレッドを制御するためのシステム・プロパティが用意されています。
デキュー・タイムアウトを制御するためにOracle AQアダプタに用意されているシステム・プロパティは、oracle.adapter.aq.wait
です。インバウンド・ポーリング・スレッドを制御するプロパティは、adapter.aq.dequeue.threads
です。
7.2.13 ストリーム・ペイロードのサポート
Oracle AQアダプタには、ストリーム・ペイロードのサポートが用意されています。この機能を有効化すると、ペイロードはメモリーDOM内のSOAランタイムで操作されるかわりにデータベースにストリーミングされます。この機能は、大きなペイロードの処理中に使用します。ストリーム・ペイロードのサポートを有効化するには、Oracle JDeveloper (JDeveloper)でデキュー操作パラメータを定義する際に「ストリーミングの有効化」チェック・ボックスを選択する必要があります。「ストリーミングの有効化」チェック・ボックスを選択すると、次の例に示すように、対応するブール・プロパティEnableStreaming
がそれぞれの.jca
ファイルに定義されているActivationSpec
プロパティに追加されます。EnableStreamingプロパティが存在しない場合は、デフォルト値のfalse
とみなされます。このプロパティは、Raw
メッセージ、XMLType
メッセージおよびADT
属性を介してペイロードが指定されるADT
タイプのメッセージを処理する際に適用可能です。
<activation-spec className="oracle.tip.adapter.aq.inbound.AQDequeueActivationSpec"> <property name="QueueName" value="RAW_IN_QUEUE"/> <property name="DatabaseSchema" value="SCOTT"/> <property name="EnableStreaming" value="true"/> </activation-spec>
7.2.14 Oracle AQアダプタのインバウンドの再試行
Oracle AQアダプタのインバウンド再試行を構成し、jca.retry.count
サービスのバインディング・プロパティを指定して、再試行可能な例外に6回以上再試行する場合は、jca.retry.count
に使用されている値よりも大きいmax_retries値でキューが作成されるようにしてください。何も指定しなければ、キューはmax_retries
値5を使用して作成されますが、これは、メッセージが5回の再試行後に例外キューに送られ、以降の処理のためにアダプタに配信されないことを意味します。5以下の値を使用して jca.retry.count
を指定すれば、キューのmax_retries
プロパティを変更する必要はありません。
キューの作成時に、次のコードを使用してmax_retries
プロパティを変更します。
begin DBMS_AQADM.CREATE_QUEUE_TABLE ( queue_table => 'RAW_IN_QUEUE_TABLE',queue_payload_type => 'RAW'); DBMS_AQADM.CREATE_QUEUE ( queue_name => 'RAW_IN_QUEUE',queue_table=> 'RAW_IN_QUEUE_TABLE', max_retries=>1500); DBMS_AQADM.START_QUEUE ( queue_name => 'RAW_IN_QUEUE'); DBMS_AQADM.CREATE_QUEUE_TABLE ( queue_table => 'RAW_OUT_QUEUE_TABLE', queue_payload_type => 'RAW'); DBMS_AQADM.CREATE_QUEUE ( queue_name => 'RAW_OUT_QUEUE', queue_table => 'RAW_OUT_QUEUE_TABLE'); DBMS_AQADM.START_QUEUE ( queue_name => 'RAW_OUT_QUEUE'); end;
7.2.16 パフォーマンス・チューニング
Oracle AQアダプタでは、パフォーマンス・チューニング機能がサポートされています。
詳細は、「Oracle JCAアダプタ・チューニング・ガイド」および「Oracle JCAアダプタのプロパティ」を参照してください。
7.3 Oracle AQアダプタのデプロイメント
Oracle AQアダプタは、インストールの一部としてアプリケーション・サーバーにデプロイされます。これには、データソースjdbc/aqSample
を指す単一アダプタ・インスタンス・エントリeis/AQ/aqSample
が含まれています。データソースはインストールの一部として作成されないため、手動で作成する必要があります。データベースへの接続情報は、データソース定義内にあります。
インストールの時点で存在するOracle AQアダプタ・インスタンスeis/AQ/aqSample
を使用するSOAプロジェクトをデプロイする場合は、最初にデータソースjdbc/aqSample
を作成する必要があります。一方、新しいアダプタ・インスタンスを使用する場合は、新しいアダプタ・インスタンスを追加してアプリケーション・サーバーを再起動する必要があります。これは、既存のアダプタ・インスタンスjdbc/aqSample
で参照されるデータソースとは別のデータソースを指すようにする場合や、まだ存在しないアダプタ・インスタンスの名前を選択した場合などです。たとえば、JDeveloperでDBConnection1
という名前の接続を作成した場合、図7-12
に示すように、AQアダプタ・サービスはデフォルトでeis/AQ/DBConnection1を指します。
また、次のコード・スニペットに示すように.jca
ファイルを確認することによって、サービスがどのアダプタ・インスタンスを指しているかを確認できます。
<connection-factory location="eis/AQ/aqSample" … />
前述の例では、場所は実行時のアダプタ・インスタンスのJNDI名です。
新しいAQアダプタ・インスタンスを作成するには、「アダプタ・コネクション・ファクトリの追加」の説明に従ってOracle WebLogic管理コンソールを使用するか、weblogic-ra.xml
ファイルを直接編集します。weblogic-ra.xml
を編集するステップは、次のとおりです。
-
fmwhome
/でAqAdapter.rar
を検索します。 -
ファイルを解凍します。
-
META-INF
/weblogic-ra.xml
(および、場合によってはra.xml
)を編集します。 -
このファイルから再びJARを作成します。
-
アプリケーション・サーバーを再起動します。
weblogic-ra.xml
に含まれるサンプルAQアダプタ・インスタンスを次に示します。
例 - weblogic-ra.xmlに含まれるサンプルAQアダプタ・インスタンス
<connection-instance> <jndi-name>eis/AQ/aqSample</jndi-name> <connection-properties> <properties> <property> <name>XADataSourceName</name> <value>jdbc/aqSample</value> </property> <property> <name>DataSourceName</name> <value></value> </property> <property> <name>ConnectionString</name> <value></value> </property> <property> <name>UserName</name> <value></value> </property> <property> <name>Password</name> <value></value> </property> <property> <name>DefaultNChar</name> <value>false</value> </property> <property> <name>UseDefaultConnectionManager</name> <value>false</value> </property> </properties> </connection-properties> </connection-instance>
必須プロパティは、jndi-name
、XADataSourceName
またはDataSourceName
です。jndi-name
プロパティは、.jca
ファイル内の場所属性に一致している必要があり、アダプタ・インスタンスの名前を表しています。XADataSourceName
またはDataSourceName
プロパティは、基礎となるデータソース(接続情報が設定されている)の名前です。XADataSourceName
またはDataSourceName
のいずれかのプロパティを指定します。使用方法は、シナリオに関与していてアダプタもグローバル・トランザクションに加える必要があるかどうか、またはローカル・トランザクション・セマンティクスが十分かどうかに応じて異なります。前者の場合にはXADataSourceName
を指定する必要があり、後者の場合にはDataSourceName
を指定する必要があります。XADataSourceName
プロパティを指定する場合は、プロパティによって参照される物理データソースでXAが有効化されていることを確認します。ただし、DataSourceName
プロパティを指定する場合は、プロパティによって参照される物理データソースでXAが有効化されている場合もされていない場合もあります。
最も一般的なミス
デプロイメントに関する最も一般的なミスとして、次の2つがあります。
-
.jca
ファイル内の場所属性に一致するアダプタ・インスタンス・エントリが作成されていません(または、インスタンスが1つも作成されていません)。 -
.jca
ファイル内の場所属性にデータソース名を直接設定しています。
後者の場合は、アダプタ・インスタンス名(eis/AQ/...
)を指定し、このインスタンス名がデータソース・プール(jdbc/...
)を指すというように間接的に指定する必要があります。一般的なミスは、このように間接的に指定せず、名前jdbc/...
を場所属性に直接指定することです。
その他のアダプタ・インスタンス・プロパティ
AQアダプタ・インスタンスには、xADataSourceName
やdataSourceName
以外にもプロパティがあります。
Oracle AQアダプタ・インスタンス・プロパティの詳細は、「Oracle AQアダプタのプロパティ」を参照してください。
7.4 Oracle AQアダプタの使用例
7.4.1 一般的な使用例
次の使用例には、アダプタ構成ウィザードの概要が含まれ、様々な状況において通常の手順を変更する方法の例も示します。それぞれの例では、生成されるWSDLファイルとJCAファイルの関連部分を示しています。
この項には次のトピックが含まれます:
7.4.1.1 アダプタ構成ウィザードの概要
この例では、service_type
オブジェクト内の1つのフィールドであるペイロードとユーザー定義スキーマを設定して、メッセージをservice_in_queue
キューにデキューするOracle AQアダプタ・サービスを作成します。
この項では、JDeveloperでアダプタ構成ウィザードを使用してOracle AQアダプタを構成する際の必須タスクについて説明します。
この項には次のトピックが含まれます:
7.4.1.1.1 前提条件
この例は、基本的なBPELコンストラクト(アクティビティやパートナ・リンクなど)と、BPELコンポジットを作成およびデプロイするJDeveloper環境をよく理解していることを前提としています。
SCOTT
スキーマを持つデータベースへのアクセス権限が必要です。
この使用例を実行するには、まず次のファイルを作成し、次の順序で実行する必要があります:
-
setup_user.sql
-
create_type_service.sql
-
create_queues.sql
-
dequeue_service.sql
-
enqueue_service.sql
setup_user.sql
の内容
grant connect, resource to scott;
;
grant aq_administrator_role to scott;
;
create_type_service.sql
の内容
create type SERVICE_TYPE as OBJECT (
MSG_ID VARCHAR2(128),
INREPLYTO_MSG_ID VARCHAR2(128),
FROM_PARTY VARCHAR2(512),
TO_PARTY VARCHAR2(512),
ACTION_NAME VARCHAR2(512),
DOCTYPE_NAME VARCHAR2(512),
DOCTYPE_REVISION VARCHAR2(512),
MSG_TYPE INT,
PAYLOAD CLOB
)
/
create_queues.sql
の内容
begin
dbms_aqadm.create_queue_table('service_in_table', 'service_type');
dbms_aqadm.create_queue('service_in_queue', 'service_in_table');
dbms_aqadm.start_queue('service_in_queue');
dbms_aqadm.create_queue_table('service_out_table', 'service_type');
dbms_aqadm.create_queue('service_out_queue', 'service_out_table');
dbms_aqadm.start_queue('service_out_queue');
end;
/
dequeue_service.sql
の内容
set serveroutput on;
DECLARE
enqueue_options dbms_aq.enqueue_options_t;
dequeue_options dbms_aq.dequeue_options_t;
message_properties dbms_aq.message_properties_t;
message_handle RAW(16);
msg_varchar varchar2(4000);
service1 service_type;
BEGIN
dequeue_options.wait:=180;
DBMS_AQ.DEQUEUE(
queue_name => 'SERVICE_OUT_QUEUE',
dequeue_options => dequeue_options,
message_properties => message_properties,
payload => service1,
msgid => message_handle);
dbms_output.put_line('SERVICE.MSG_ID="' || SERVICE1.MSG_ID || '"');
dbms_output.put_line('SERVICE.INREPLYTO_MSG_ID="' || SERVICE1.INREPLYTO_MSG_ID || '"');
dbms_output.put_line('SERVICE.FROM_PARTY="' || SERVICE1.FROM_PARTY || '"');
dbms_output.put_line('SERVICE.TO_PARTY="' || SERVICE1.TO_PARTY || '"');
dbms_output.put_line('SERVICE.ACTION_NAME="' || SERVICE1.ACTION_NAME || '"');
dbms_output.put_line('SERVICE.DOCTYPE_NAME ="' || SERVICE1.DOCTYPE_NAME || '"');
dbms_output.put_line('SERVICE.DOCTYPE_REVISION ="' || SERVICE1.DOCTYPE_REVISION || '"');
dbms_output.put_line('SERVICE.MSG_TYPE="' || SERVICE1.MSG_TYPE || '"');
dbms_output.put_line('SERVICE.PAYLOAD="' || SERVICE1.PAYLOAD|| '"');
END;
/
enqueue_service.sql
の内容
DECLARE
enqueue_options dbms_aq.enqueue_options_t;
message_properties dbms_aq.message_properties_t;
msgid RAW(16);
qname VARCHAR2(100);
service service_type;
BEGIN
qname := 'service_in_queue';
service := service_type('reply123', 'request123', 'seller', 'buyer', 'ack','b2bDoc', '1.1', 1, '<?xml version="1.0" encoding="UTF-8"?><SERVICE xmlns="http://www.oracle.com/service/contract"><DESCRIPTION>ADT with CLOB payload testcase</DESCRIPTION><RATE>100.00</RATE></SERVICE>');
dbms_aq.enqueue(queue_name => qname,
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => service,
msgid => msgid);
commit;
END;
/
7.4.1.1.2 アプリケーションおよびSOAプロジェクトの作成
SOAコンポジットを含んだJDeveloperアプリケーションを作成する必要があります。アプリケーションとSOAプロジェクトを作成するステップは、次のとおりです:
7.4.1.1.3 Oracle AQアダプタ・サービスの定義
次のステップは、Oracle AQアダプタ・サービスを定義することです。次のステップに従ってOracle AQアダプタ・サービスを作成します。
-
「コンポーネント」から、AQアダプタを「公開されたサービス」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
-
サービス名を指定して「次へ」をクリックします。
「サービス接続」ページが表示されます。
-
プラス・アイコンをクリックしてデータベース接続を作成します。
「データベース接続の作成」ページが表示されます。
ノート:
Oracle Applicationsを実行中のデータベースに接続する必要があります。
-
次の情報を入力します。
-
「接続の作成場所」で、「アプリケーション・リソース」を選択します。
-
「接続名」フィールドで、データベース接続に使用する一意の名前を指定します。
この例では、DBConnection1と入力します。
-
「接続タイプ」ボックスから「Oracle (JDBC)」を選択します。
-
「ユーザー名」フィールドで、データベースへのアクセスが認証されているユーザー名を指定します。
この例では、
scott
と入力します。 -
「ロール」フィールドで、必要に応じてロールを入力します。
これは、データベースに指定されている
SYSDBA
などの特定のデータベース・ロールである必要があります。このフィールドはオプションです。この例では、「ロール」フィールドは空白にしておきます。 -
「パスワード」フィールドで、指定されたユーザー名に関連付けるパスワードを指定します。
この例では、
tiger
と入力します。 -
「パスワードの保存」と「パスワードのデプロイ」を順番に選択します。
-
「ドライバ」リストから「thin」を選択します。
-
「ホスト名」フィールドで、Oracleサーバーを実行するシステムを識別する値を入力します。
TCP/IPで解決できるIPアドレスまたはホスト名(
myserver
など)を使用します。デフォルト値はlocalhost
です。 -
「JDBCポート」フィールドで、TCP/IPポートを識別する値を入力します。デフォルトは
1521
です。 -
「SID」フィールドで、Oracleデータベース・インスタンスの一意のシステム識別子(SID)の値を入力します。
デフォルトは
XE
です。 -
「接続のテスト」をクリックし、指定した情報によりデータベースとの接続が確立されるかどうかを確認します。
成功メッセージが表示されます。
-
「OK」をクリックします。
作成した接続が「サービス名」ページの「接続」フィールドに表示されます。
データベース接続の作成を完了すると、「JNDI名」フィールドにJava Naming and Directory Interface (JNDI)名が移入されます。JNDI名は、サービスがBPELサーバーにデプロイされるときに使用される接続のプレースホルダとなります。JNDIをプレースホルダとして使用すると、開発とその後の本番に異なるデータベースを使用できます。
アダプタが管理モードで確実に実行されるように、JNDI名で指定した値がOracle AQアダプタの
weblogic-ra.xml
ファイルに存在する必要があります。デフォルトの接続インスタンスeis/AQ/aqSample
が用意されており、このフィールドのデフォルト値として使用できます。この接続インスタンスを使用するには、JNDI名jdbc/aqSample
を使用してデータソースを作成する必要もあります。
-
-
「次へ」をクリックすると、「アダプタ・インタフェース」ページが表示されます。
-
「操作およびスキーマから定義(後で指定)」を選択し、「次へ」をクリックします。
-
「操作」ページが表示されます。Oracle AQアダプタでは、3つの操作をサポートしています。
-
デキュー: キューから受信するメッセージをポーリングします。
-
エンキュー: 発信メッセージをキューに置きます。
-
エンキュー/デキュー: 発信メッセージをキューに置き、キュー上でレスポンス・メッセージを待機します。
この例では、「Dequeue」を選択します。操作には、選択した操作名に基づいて名前が自動的に付けられます。ただし、「操作名」フィールドは編集できます。
ノート:
インバウンドOracle AQ Adapterを使用してADT (抽象データ型)に基づいてキューからデキューするSOAコンポジットを作成する場合、
.jca config
ファイルのSchemaValidation
プロパティがtrue
に設定されていると、データを持たないフィールドは、<FIELD_NAME xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns=""/>
として返されます。SchemaValidation
がfalse
に設定されている場合は、同じフィールドが<FILED_NAME NULL="TRUE"/>
として返されます前者は有効なXMLで、後者は無効なXMLです。後者は11gとの下位互換性を確保するために返され、返されるXMLではスキーマの検証は行われません。次に示すのは、ADT型のCREATE OR REPLACE TYPE persons_address AS OBJECTの例です( streetNumber NUMBER, streetName VARCHAR2(30), citySuburb VARCHAR2(30), state VARCHAR2(4), postCode NUMBER );
-
-
「次へ」をクリックすると、「キュー名」ページが表示されます。
-
「データベース・スキーマ」リストからデータベース・スキーマを選択するか、「参照」をクリックしてスキーマを参照します。この例で、「参照」をクリックします。「キューの選択」ダイアログが表示されます。
-
必要なキューを選択して「OK」をクリックし、「次へ」をクリックします。「キュー・パラメータ」ページが表示されます。
-
パラメータ値を入力して「次へ」をクリックします。
-
コンシューマ: AQアダプタ・キュー・パラメータ・ページの「コンシューマ」セクションを使用して、キューにサブスクライブするエージェントの名前を指定します。このフィールドは、インバウンド・マルチコンシューマ・キューの場合に表示されます。
-
相関ID: 1文字から30文字までの長さでオプションの相関IDを入力します。これは、同じ相関IDを使用したデキュー・アクティビティによって後から取得されるメッセージの識別に使用されます。
入力する値は、非同期通信のためにエンキューの送信元とデキューの受信先で同意されています。相関IDはAQヘッダー・プロパティにマップされます。インバウンド方向の相関IDにより、デキューするメッセージの選択が可能になります。このフィールドはオプションです。値を入力しない場合は、キューにあるすべてのメッセージが処理されます。
アウトバウンド方向の相関IDの値を入力した場合、適切なIDを持つすべてのアウトバウンド・メッセージが入力した値に設定されます。この値はアウトバウンド・ヘッダーの相関フィールドで、メッセージごとにオーバーライドできます。
-
メッセージ・セレクタ・ルール: AQアダプタ・キュー・パラメータ・ページの「メッセージ・セレクタ・ルール」を使用して、コンシューマ名を使用するエージェントを指定します。ただし、これはデキュー操作用のマルチ・コンシューマ・キューを備えたアドバンスト・キュー・アダプタ・ウィザードを使用している場合にかぎります。このフィールドに入力した場合、コンシューマ名とルールを使用するエージェントがキューに作成されます。アダプタでは、以前に作成したエージェントのルールは変更されないため、コンシューマ名は新しいエージェント名にする必要があります。入力したロジックの検証が実行されません。このフィールドはインバウンド・マルチコンシューマ・キューの場合に表示されます。
メッセージ・セレクタ・ルールの使用方法の詳細は、「デキューおよびエンキューの機能」を参照してください。
-
デキュー条件: 「操作」ページでデキューを選択した場合にのみ表示されます。
SQL
問合せのWHERE
句に似たブール式を入力します。このブール式には、メッセージ・プロパティ、ユーザー・データ・プロパティ(オブジェクト・ペイロード
のみ)およびPL/SQLまたはSQL関数に関する条件を含めることができます。複数のメッセージがデキュー条件を満たす場合、デキュー順序は不定になり、キューのソート順は考慮されません。このフィールドは、インバウンド・シングル・コンシューマおよびマルチ・コンシューマ・キューに対して表示されます。
-
-
「次へ」をクリックします。「オブジェクト・ペイロード」ページが表示されます
-
「ビジネス・ペイロード」で、「オブジェクト内のフィールド」を選択します。
-
「ペイロード・フィールド・オプション」セクションで「参照」をクリックし、ビジネス・ペイロードが含まれるフィールドを選択します。
-
-
フィールドを選択して「OK」をクリックします。
この例では、「PAYLOAD (CLOB)」を選択します。
-
「ペイロード以外のフィールドへのアクセスも必要」を選択して「次へ」をクリックします。「メッセージ」ページが表示されます。
「メッセージ」ページには、次のオプションが表示されます。
-
ネイティブ・フォーマット変換は不要(スキーマを不透明(Opaque)にする): スキーマを指定しない場合は、このオプションを選択します。このオプションを選択すると、「メッセージ・スキーマ」の他のフィールドがすべて無効化されます。
-
URL: スキーマ・ファイルURLのパスを入力するか、「参照」をクリックしてパスを参照できます。
-
スキーマ要素: スキーマ要素名。
-
-
この例では、「スキーマ・ファイルを参照」をクリックしてスキーマ・ファイルURLを参照します。
「タイプ・チューザ」ダイアログが表示されます。
-
リストからSERVICEを選択し、「OK」をクリックして「次へ」をクリックします。
-
「JCAエンドポイント・プロパティ」画面で「次へ」をクリックします。
-
「終了」画面で「終了」をクリックします。
7.4.1.1.4 生成されたWSDLおよびJCAファイル
アダプタ・サービスにより、定義済のアダプタ・インタフェースとして機能するWSDLおよびJCAファイルが生成されます。
デキュー操作用に生成されたWSDLファイルを次に示します。
<definitions name="Inbound" targetNamespace="http://xmlns.oracle.com/pcbpel/adapter/aq/Inbound/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://xmlns.oracle.com/pcbpel/adapter/aq/Inbound/" xmlns:plt="http://schemas.xmlsoap.org/ws/2003/05/partner-link/" xmlns:obj1="http://xmlns.oracle.com/xdb/SCOTT" xmlns:imp1="http://www.oracle.com/service/contract"> <types> <schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://xmlns.oracle.com/pcbpel/adapter/aq/Inbound/" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://xmlns.oracle.com/pcbpel/adapter/aq/Inbound/" xmlns:hdr="http://xmlns.oracle.com/pcbpel/adapter/aq/inbound/" xmlns:obj1="http://xmlns.oracle.com/xdb/SCOTT"> <import namespace="http://xmlns.oracle.com/xdb/SCOTT" schemaLocation="xsd/SCOTT_SERVICE_TYPE.xsd"/> <import namespace="http://xmlns.oracle.com/pcbpel/adapter/aq/inbound/" schemaLocation="xsd/aqAdapterInboundHeader.xsd"/> <complexType name="HeaderCType"> <sequence> <element name="QueueHeader" type="hdr:HeaderType"/> <element name="PayloadHeader" type="obj1:SERVICE_TYPE"/> </sequence> </complexType> <element name="Header" type="tns:HeaderCType"/> </schema> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <import namespace="http://www.oracle.com/service/contract" schemaLocation="xsd/service.xsd"/> </schema> </types> <message name="SERVICE_msg"> <part name="SERVICE" element="imp1:SERVICE"/> </message> <message name="Header_msg"> <part name="Header" element="tns:Header"/> </message> <portType name="Dequeue_ptt"> <operation name="Dequeue"> <input message="tns:SERVICE_msg"/> </operation> </portType> <plt:partnerLinkType name="Dequeue_plt"> <plt:role name="Dequeue_role"> <plt:portType name="tns:Dequeue_ptt"/> </plt:role> </plt:partnerLinkType> </definitions>
7.4.1.2 オブジェクトとADTペイロードのデキューおよびエンキュー
デキューとエンキューについては、「ADTキュー」を参照してください。
オブジェクト全体をペイロードとしてエンキューまたはデキューするには、次のステップを実行します:
-
「Oracle AQアダプタ・サービスの定義」のステップ7で、「エンキュー」または「デキュー」を選択します。
-
「オブジェクトCUSTOMER_TYPE全体」を選択し、「Oracle AQアダプタ・サービスの定義」のステップ12にスキップします。
ノート:
ALTER OBJECT
などの展開コマンドを使用してADTタイプを修正した場合は、AQアダプタによりORA-25215
SQL例外がスローされます。
この例外を回避するには、CREATE OBJECT
のみを使用して(ALTER OBJECT
などの展開コマンドを発行することなく) ADTタイプに属性を追加します。
7.4.1.3 オブジェクト・ペイロードの1つの列のデキュー
これは、オブジェクト・ペイロード内の単一のフィールドまたは列をデキューする例です。
オブジェクト内の1つのフィールドをデキューするOracle AQアダプタを作成するには、アダプタ構成ウィザードの「オブジェクト・ペイロード」ページで次のステップを実行します:
生成されたJCAファイルの次のセグメントには、ペイロード・ヘッダー・フィールド以外に、1つのフィールド(この場合はPAYLOAD
という名前のフィールド)がデキューされることが指定されています。
<adapter-config name="Inbound" adapter="AQ Adapter" xmlns="http://platform.integration.oracle/blocks /adapter/fw/metadata"> <connection-factory location="eis/AQ/aqSample" UIConnectionName="Connection1" adapterRef=""/> <endpoint-activation portType="Dequeue_ptt" operation="Dequeue"> <activation-spec className="oracle.tip.adapter.aq.inbound.AQDequeueActivationSpec"> <property name="QueueName" value="SERVICE_IN_QUEUE"/> <property name="ObjectFieldName" value="PAYLOAD"/> <property name="PayloadHeaderRequired" value="true"/> <property name="SchemaValidation" value="false"/> </activation-spec> </endpoint-activation> </adapter-config>
7.4.1.4 エンキュー/デキュー操作タイプの構成
この使用例では、Oracle AQアダプタが発信メッセージをキューに蓄積し、別のキュー上のレスポンス・メッセージを待機する、Oracle AQアダプタのエンキュー/デキュー操作タイプを構成する手順について説明します。
この項には次のトピックが含まれます:
7.4.1.4.1 アプリケーションおよびSOAプロジェクトの作成
SOAコンポジットを含んだJDeveloperアプリケーションを作成する必要があります。「アプリケーションおよびSOAプロジェクトの作成」に記載されたステップに従って、アプリケーションおよびSOAプロジェクトを作成します。
7.4.1.4.2 Oracle AQアダプタ・サービスの定義
発信メッセージをキューに蓄積し、キューのレスポンス・メッセージを待機するOracle AQアダプタ・サービスを作成するステップは、次のとおりです。
-
「サービス・アダプタ」リストから「AQアダプタ」を「composite.xml」ページの「公開されたサービス」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
-
サービス名を指定して「次へ」をクリックします。「サービス接続」ページが表示されます。
-
プラス・アイコンをクリックしてデータベース接続を作成します。「データベース接続の作成」ページが表示されます。
ノート:
Oracle Applicationsを実行中のデータベースに接続する必要があります。
-
次の情報を入力します。
-
「接続の作成場所」で、「アプリケーション・リソース」を選択します。
-
「接続名」フィールドで、データベース接続に使用する一意の名前を指定します。
-
「接続タイプ」ボックスから「Oracle (JDBC)」を選択します。
-
「ユーザー名」フィールドで、データベースへのアクセスが認証されているユーザー名を指定します。
この例では、
scott
と入力します。 -
「ロール」フィールドで、必要に応じてロールを入力します。
これは、データベースに指定されている
SYSDBA
などの特定のデータベース・ロールである必要があります。このフィールドはオプションです。この例では、「ロール」フィールドは空白にしておきます。 -
「パスワード」フィールドで、指定されたユーザー名に関連付けるパスワードを指定します。
この例では、
tiger
と入力します。 -
「パスワードの保存」と「パスワードのデプロイ」を順番に選択します。
-
「ドライバ」リストから「thin」を選択します。
-
「ホスト名」フィールドで、Oracleサーバーを実行するシステムを識別する値を入力します。
TCP/IPで解決できるIPアドレスまたはホスト名(
myserver
など)を使用します。デフォルト値はlocalhost
です。 -
「JDBCポート」フィールドで、TCP/IPポートを識別する値を入力します。デフォルトは
1521
です。 -
「SID」フィールドで、Oracleデータベース・インスタンスの一意のシステム識別子(SID)の値を入力します。
デフォルトは
XE
です。 -
「接続のテスト」をクリックし、指定した情報によりデータベースとの接続が確立されるかどうかを確認します。
成功メッセージが表示されます。
-
「OK」をクリックします。
作成した接続が「サービス接続」ページの「接続」フィールドに表示されます。
また、データベース接続を作成した後、「JNDI名」フィールドに移入が行われます。
アダプタが管理モードで確実に実行されるように、JNDI名で指定した値がOracle AQアダプタの
weblogic-ra.xml
ファイルに存在する必要があります。デフォルトの接続インスタンスeis/AQ/aqSample
が用意されており、このフィールドのデフォルト値として使用できます。この接続インスタンスを使用するには、JNDI名jdbc/aqSample
を使用してデータソースを作成する必要もあります。
-
-
「次へ」をクリックします。
アダプタ構成ウィザードの「アダプタ・インタフェース」ページが表示されます。
-
「アダプタ・インタフェース」ページで、「操作およびスキーマから定義(後で指定)」を選択します。
-
「次へ」をクリックします。
「操作」ページが表示されます。
-
「エンキュー/デキュー」を選択します。
-
「次へ」をクリックします。「キュー名」ページが表示されます
-
リクエスト・キューを参照するには、「参照」をクリックします。「キューの選択」ダイアログが表示されます
-
必要なキューを選択して「OK」をクリックします。
この例では、「CORRELATION_REQUEST」を選択します。図7-21に示すように、「キュー名」フィールドにCORRELATION_REQUESTが移入された状態で「キュー名」ページが表示されます。
-
ステップ12と13を繰り返して、キュー情報をエンキューします。
「キュー名」ページが表示されます。
-
「次へ」をクリックします。「キュー・パラメータ」ページが表示されます
-
「次へ」をクリックします。「オブジェクト・ペイロード」ページが表示されます
-
「ビジネス・ペイロード」オプション、「オブジェクトCORRELATIONREQUEST_TYPE全体」および「オブジェクトCORRELATIONREPLY_TYPE全体」を選択します。
-
「次へ」をクリックします。
「終了」画面が表示されます。このページには、ウィザードにより作成されるアダプタ・ファイルのパスと名前が表示されます。
-
「終了」をクリックします。
同期エンキュー/デキュー操作に対して、AQアダプタ・サービスの作成を完了しました。
7.4.1.4.3 サービスとアクティビティのワイヤリング
BPELプロセスおよびアウトバウンド・アダプタ参照をアセンブルまたは接続する必要があります。コンポーネントを接続するステップは、次のとおりです。
-
「コンポーネント」領域にあるBPELプロセス内の小さい三角形を、「外部参照」領域のRequestReply内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。
JDeveloperのcomposite.xmlが図7-24のように表示されます。
-
「ファイル」、「すべて保存」を順番にクリックします。
invokeアクティビティの追加
-
「BPELProcess1」をダブルクリックします。「BPELProcess1.bpel」ページが表示されます。
-
「コンポーネント」ウィンドウから設計領域にinvokeアクティビティをドラッグ・アンド・ドロップします。
-
invokeアクティビティをダブルクリックします。「Invoke」ダイアログが表示されます。
-
「名前」フィールドにinvokeアクティビティの名前を入力します。
-
「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。図7-25に示すように、「パートナ・リンク・チューザ」ダイアログが表示されます。
-
「RequestReply」を選択して「OK」をクリックします。
-
図7-26に示すように、「Invoke」ダイアログで、「入力変数」フィールドの右にある「入力変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
-
デフォルトの変数名を選択し、「OK」をクリックします。デフォルトの変数名が「変数」フィールドに移入されます。
-
「OK」をクリックします。図7-27に示すように、JDeveloperの「BPELProcess1.bpel」ページが表示されます。
assignアクティビティの追加
-
「コンポーネント」ウィンドウから設計領域にassignアクティビティをドラッグ・アンド・ドロップします。
-
assignアクティビティをダブルクリックします。「Assign」ダイアログが表示されます。
-
「名前」フィールドにassignアクティビティの名前を入力します。
-
「コピー操作」タブをクリックします。
-
「コピー操作」を選択します。「コピー操作の作成」ダイアログが表示されます。
-
図7-28に示すように、inputVariableからoutputVariableへのコピー操作を作成します。
-
「コピー操作の作成」ダイアログで「OK」をクリックします。
-
図7-29に示すように、inputVariableからInvoke_1_Enqueue_InputVariableへの別のコピー操作を作成します。
-
「コピー操作の作成」ダイアログで「OK」をクリックします。
-
図7-30に示すように、「OK」をクリックしてJDeveloperの「BPELProcess1.bpel」ページに戻ります。
-
「ファイル」、「すべて保存」を順番にクリックします。
receiveアクティビティの追加
7.4.1.4.4 JDeveloperを使用したデプロイ
前述のステップで作成したSOAプロジェクトおよびアプリケーションについて、アプリケーション・プロファイルをデプロイする必要があります。JDeveloperを使用してアプリケーション・プロファイルをデプロイするには、次のステップを実行する必要があります。
- アプリケーション・サーバー接続を作成します。詳細は、「Oracle JCAアダプタ用のアプリケーション・サーバー接続の作成」を参照してください。
- アプリケーションをデプロイします。詳細は、「JDeveloperからのOracle JCAアダプタ・アプリケーションのデプロイ」を参照してください。
7.4.1.4.5 Oracle Fusion Middleware Controlコンソールを使用した監視
Fusion Middleware Controlコンソールを使用して、デプロイ済のコンポジットを監視できます。次のステップを実行します。
http://servername:portnumber/em
にナビゲートします。デプロイしたコンポジットがアプリケーション・ナビゲータに表示されます。- インスタンスをクリックします。「フローのトレース」ページが表示されます。
- 「BPEL」コンポーネント・インスタンスをクリックします。「監査」ページが表示されます。
- 「フロー - デバッグ」タブをクリックしてインスタンスをデバッグします。
7.4.1.4.6 生成されたWSDLおよびJCAファイル
エンキュー/デキュー操作用に生成されたWSDLファイルを次に示します。
<?xml version = '1.0' encoding = 'UTF-8'?> <?binding.jca Inbound_aq.jca?> <definitions name="Inbound" targetNamespace="http://xmlns.oracle.com/pcbpel/adapter/aq/Inbound/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://xmlns.oracle.com/pcbpel/adapter/aq/Inbound/" xmlns:plt="http://schemas.xmlsoap.org/ws/2003/05/partner-link/" xmlns:obj1="http://xmlns.oracle.com/xdb/SCOTT" xmlns:imp1="http://www.oracle.com/ipdemo"> <types> <schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://xmlns.oracle.com/pcbpel/adapter/aq/Inbound/" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://xmlns.oracle.com/pcbpel/adapter/aq/Inbound/" xmlns:hdr="http://xmlns.oracle.com/pcbpel/adapter/aq/inbound/" xmlns:obj1="http://xmlns.oracle.com/xdb/SCOTT"> <import namespace="http://xmlns.oracle.com/xdb/SCOTT" schemaLocation="xsd/SCOTT_MAGAZINE_TYPE.xsd"/> <import namespace="http://xmlns.oracle.com/pcbpel/adapter/aq/inbound/" schemaLocation="xsd/aqAdapterInboundHeader.xsd"/> <complexType name="HeaderCType"> <sequence> <element name="QueueHeader" type="hdr:HeaderType"/> <element name="PayloadHeader" type="obj1:MAGAZINE_TYPE"/> </sequence> </complexType> <element name="Header" type="tns:HeaderCType"/> </schema> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <import namespace="http://www.oracle.com/ipdemo" schemaLocation="xsd/simpleMagazine.xsd"/> </schema> <?xml version = '1.0' encoding = 'UTF-8'?> <?binding.jca Inbound_aq.jca?> <definitions name="Inbound" targetNamespace="http://xmlns.oracle.com/pcbpel/adapter/aq/Inbound/ xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://xmlns.oracle.com/pcbpel/adapter/aq/Inbound/" xmlns:plt="http://schemas.xmlsoap.org/ws/2003/05/partner-link/" xmlns:obj1="http://xmlns.oracle.com/xdb/SCOTT" xmlns:imp1="http://www.oracle.com/ipdemo"> <types> <schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://xmlns.oracle.com/pcbpel/adapter/aq/Inbound/" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://xmlns.oracle.com/pcbpel/adapter/aq/Inbound/" xmlns:hdr="http://xmlns.oracle.com/pcbpel/adapter/aq/inbound/" xmlns:obj1="http://xmlns.oracle.com/xdb/SCOTT"> <import namespace="http://xmlns.oracle.com/xdb/SCOTT" schemaLocation="xsd/SCOTT_MAGAZINE_TYPE.xsd"/> <import namespace="http://xmlns.oracle.com/pcbpel/adapter/aq/inbound/" schemaLocation="xsd/aqAdapterInboundHeader.xsd"/> <complexType name="HeaderCType"> <sequence> <element name="QueueHeader" type="hdr:HeaderType"/> <element name="PayloadHeader" type="obj1:MAGAZINE_TYPE"/> </sequence> </complexType> <element name="Header" type="tns:HeaderCType"/> </schema> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <import namespace="http://www.oracle.com/ipdemo" schemaLocation="xsd/simpleMagazine.xsd"/> </schema> </types> <message name="simpleMagazine_msg"> <part name="simpleMagazine" element="imp1:simpleMagazine"/> </message> <message name="Header_msg"> <part name="Header" element="tns:Header"/> </message> <portType name="Dequeue_ptt"> <operation name="Dequeue"> <input message="tns:simpleMagazine_msg"/> </operation> </portType> <plt:partnerLinkType name="Dequeue_plt"> <plt:role name="Dequeue_role"> <plt:portType name="tns:Dequeue_ptt"/> </plt:role> </plt:partnerLinkType> </definitions>
エンキュー/デキュー操作用に生成されたJCAファイルを次に示します。
<adapter-config name="RequestReply" adapter="AQ Adapter" wsdlLocation="RequestReply.wsdl" xmlns="http://platform.integration.oracle/blocks/adapter/fw/metadata"> <connection-factory location="eis/AQ/aqSample" UIConnectionName="aqSample" adapterRef=""/> <endpoint-activation portType="Dequeue_ptt" operation="Dequeue" UITransmissionPrimitive="Request-response"> <activation-spec className="oracle.tip.adapter.aq.inbound.AQDequeueActivationSpec"> <property name="QueueName" value="CORRELATION_REPLY"/> </activation-spec> </endpoint-activation> <endpoint-interaction portType="Enqueue_ptt" operation="Enqueue" UITransmissionPrimitive="Request-response"> <interaction-spec className="oracle.tip.adapter.aq.outbound.AQEnqueueInteractionSpec"> <property name="QueueName" value="CORRELATION_REQUEST"/> </interaction-spec> </endpoint-interaction> </adapter-config>
7.4.1.5 デキュー中のメッセージのフィルタ処理に対する相関IDの使用
特定の相関IDのメッセージのみをデキューするアダプタを設定するには、次のステップを実行します:
-
「Oracle AQアダプタ・サービスの定義」のステップ7で、「デキュー」操作を選択します。
-
「Oracle AQアダプタ・サービスの定義」のステップ12で相関IDを入力します。
アダプタにより、それと同様の相関IDでエンキューされたメッセージのみがデキューされます。
7.4.1.6 マルチ・サブスクライバ・キューからのエンキューおよびデキュー
マルチ・サブスクライバ・キューには、複数のユーザーがアクセスできます。また、それらのユーザーがキュー内の特定のタイプのメッセージのみを対象とする場合もあります。たとえば、$100,000を超えるローンには監督者の承認が必要であるのに対して、$100,000未満のローンは通常のローン承認スタッフが承認できるローン・アプリケーションがあり、そのアプリケーションにマルチ・ユーザー・キューがあるとします。この場合、BPELプロセスでは、1つのアダプタが監督者用の巨額ローンのローン・アプリケーションのエンキューに使用され、もう1つのアダプタが同じマルチ・サブスクライバ・キューにある一般スタッフ用の小額ローンのローン・アプリケーションのエンキューに使用されます。
マルチ・サブスクライバ・キューにエンキューするアダプタを指定し、「受信者」フィールドでキュー・パラメータを指定します。
「Oracle AQアダプタ・サービスの定義」のステップ11で、「受信者」フィールドにBobを指定します。
次に、受信者リストBob
を使用してエンキューするOracle AQアダプタを定義して生成されたJCAファイルのコードを示します。
<adapter-config name="Inbound" adapter="AQ Adapter" xmlns="http://platform.integration.oracle/blocks/adapter/fw/metadata"> <connection-factory location="eis/AQ/aqSample" UIConnectionName="aqSample" adapterRef=""/> <endpoint-interaction portType="Enqueue_ptt" operation="Enqueue"> <interaction-spec className="oracle.tip.adapter.aq.outbound.AQEnqueueInteractionSpec"> <property name="QueueName" value="PURCHASEORDER_APPROVAL"/> <property name="RecipientList" value="Bob"/> </interaction-spec> </endpoint-interaction> </adapter-config>
マルチ・サブスクライバ・キューからデキューすると、「キュー・パラメータ」ウィンドウが表示されます。
「コンシューマ」フィールドは、コンシューマ名またはキュー・サブスクライバ名を指定するフィールドです。デキューするメッセージのエンキュー・プロセスの「受信者」エントリと一致する必要があります。マルチ・コンシューマ・キューへのサブスクライブには、このフィールドが必要です。
次に、コンシューマ名を使用するOracle AQアダプタを定義して生成されるJCAファイルのコードを示します。
<adapter-config name="Dequer_Bob" adapter="AQ Adapter" xmlns="http://platform.integration.oracle/blocks/adapter/fw/metadata"> <connection-factory location="eis/AQ/manas" UIConnectionName="aqSample" adapterRef=""/> <endpoint-activation portType="Dequeue_ptt" operation="Dequeue"> <activation-spec className="oracle.tip.adapter.aq.inbound.AQDequeueActivationSpec"> <property name="QueueName" value="PURCHASEORDER_APPROVAL"/> <property name="Consumer" value="Bob"/> <property name="SchemaValidation" value="false"/> </activation-spec> </endpoint-activation> </adapter-config>
7.4.1.7 デキュー中のメッセージのフィルタ処理に対するメッセージ・セレクタ・ルールの使用
次に、マルチ・コンシューマ・キューへのルール・ベースのサブスクリプションの作成例を示します。この例では、同じキュー内のメッセージをサブスクライブするために2つのサブスクライバが作成されます。このシナリオでは、メッセージはサブスクライバのサブスクリプション・ルールによってフィルタ処理されます。
- SQLコマンドを使用して、サービス・タイプ、マルチ・コンシューマ・キュー表およびキューを作成し、キューを開始します。この例では、デプロイするSOAコンポジットで使用されるスキーマと同じスキーマを使用して、Oracleデータベースに接続します:
create type SERVICE_TYPE as OBJECT ( MSG_ID VARCHAR2(128), INREPLYTO_MSG_ID VARCHAR2(128), FROM_PARTY VARCHAR2(512), TO_PARTY VARCHAR2(512), ACTION_NAME VARCHAR2(512), DOCTYPE_NAME VARCHAR2(512), DOCTYPE_REVISION VARCHAR2(512), MSG_TYPE INT, PAYLOAD CLOB ) / BEGIN DBMS_AQADM.CREATE_QUEUE_TABLE (queue_table => 'service_in_table', queue_payload_type => 'service_type', multiple_consumers => TRUE); END; / begin dbms_aqadm.create_queue('service_in_queue', 'service_in_table'); dbms_aqadm.start_queue('service_in_queue'); end; /
- JDeveloper AQアダプタ・ウィザードを使用して、ルールを含むAQアダプタ
consumer_1
を作成します。生成されたAQアダプタJCAファイルは、作成後に次のようになります:<adapter-config name="aqService" adapter="aq" wsdlLocation="../WSDLs/aqService.wsdl" xmlns="http://platform.integration.oracle/blocks/adapter/fw/metadata"> <connection-factory UIConnectionName="Oracle" location="eis/AQ/aqSample"/> <endpoint-activation portType="Dequeue_ptt" operation="Dequeue"> <activation-spec className="oracle.tip.adapter.aq.inbound.AQDequeueActivationSpec"> <property name="MessageSelectorRule" value="tab.user_data.MSG_ID='reply123'"/> <property name="Consumer" value="consumer_1"/> <property name="QueueName" value="SERVICE_IN_QUEUE"/> <property name="SchemaValidation" value="false"/> </activation-spec> </endpoint-activation> </adapter-config>
- JDeveloper AQアダプタ・ウィザードを使用して、ルールを含むAQアダプタ
consumer_2
を作成します。生成されたAQアダプタJCAファイルは、作成後に次のようになります:<adapter-config name="aqService" adapter="aq" wsdlLocation="../WSDLs/aqService.wsdl" xmlns="http://platform.integration.oracle/blocks/adapter/fw/metadata"> <connection-factory UIConnectionName="Oracle" location="eis/AQ/aqSample"/> <endpoint-activation portType="Dequeue_ptt" operation="Dequeue"> <activation-spec className="oracle.tip.adapter.aq.inbound.AQDequeueActivationSpec"> <property name="MessageSelectorRule" value="tab.user_data.MSG_ID='reply124'"/> <property name="Consumer" value="consumer_2"/> <property name="QueueName" value="SERVICE_IN_QUEUE"/> <property name="SchemaValidation" value="false"/> </activation-spec> </endpoint-activation> </adapter-config>
新しいサブスクライバを作成するたびに、異なるコンシューマ名にする必要があることに注意してください。
consumer_1
の場合、MSG_ID='reply123'
のメッセージのみを受信します。consumer_2
の場合、MSG_ID='reply124'
のメッセージのみを受信します。ルール内のメッセージ本文のMSG_ID
フィールドにアクセスしているため、MSG_ID
フィールドの前にtab.user_data.
接頭辞を付ける必要があります。 - サブスクライバは、SOAコンポジットのデプロイメント時に登録されます。SQLコマンドを使用してSOAコンポジットをデプロイした後、サブスクライバを検索できます:
select * from AQ$service_in_table_r;
コマンドの一般的な形式は次のとおりです:
select * from user_schema_name.AQ$queue_table_name_r;
ここで、
user_schema_name
およびqueue_table_name
は、適切なスキーマ名および表名です。スキーマ名を省略すると、データベースへの接続に使用される現在のスキーマ名が使用されます。このコマンドは、次のような結果を返します:
SERVICE_IN_QUEUE CONSUMER_1 0 tab.user_data.MSG_ID='reply123' SERVICE_IN_QUEUE$21 SERVICE_IN_QUEUE CONSUMER_2 0 tab.user_data.MSG_ID='reply124' SERVICE_IN_QUEUE$22
-
メッセージをエンキューします。
consumer_1
のメッセージ:DECLARE enqueue_options dbms_aq.enqueue_options_t; message_properties dbms_aq.message_properties_t; msgid RAW(16); qname VARCHAR2(100); service service_type; BEGIN qname := 'service_in_queue'; service := service_type('reply123', 'request124', 'seller', 'buyer', 'ack','b2bDoc', '1.1', 1, '<?xml version="1.0" encoding="UTF-8"?><SERVICE xmlns="http://www.oracle.com/service/contract"><DESCRIPTION>ADT with CLOB payload testcase</DESCRIPTION><RATE>100.00</RATE></SERVICE>'); dbms_aq.enqueue(queue_name => qname, enqueue_options => enqueue_options, message_properties => message_properties, payload => service, msgid => msgid); commit; END; /
consumer_2
のメッセージ:DECLARE enqueue_options dbms_aq.enqueue_options_t; message_properties dbms_aq.message_properties_t; msgid RAW(16); qname VARCHAR2(100); service service_type; BEGIN qname := 'service_in_queue'; service := service_type('reply124', 'request124', 'seller', 'buyer', 'ack','b2bDoc', '1.1', 1, '<?xml version="1.0" encoding="UTF-8"?><SERVICE xmlns="http://www.oracle.com/service/contract"><DESCRIPTION>ADT with CLOB payload testcase</DESCRIPTION><RATE>100.00</RATE></SERVICE>'); dbms_aq.enqueue(queue_name => qname, enqueue_options => enqueue_options, message_properties => message_properties, payload => service, msgid => msgid); commit; END; /
- 作成したすべてを削除する場合は、次のステップを実行します。
- キューおよびキュー表を停止および削除するには:
BEGIN DBMS_AQADM.stop_queue('service_in_queue'); DBMS_AQADM.drop_queue('service_in_queue'); dbms_aqadm.drop_queue_table('service_in_table'); END; /
- 作成したタイプを削除するには:
drop type SERVICE_TYPE;
- サブスクライバを削除するには:
DECLARE subscriber sys.aq$_agent; BEGIN subscriber := sys.aq$_agent ('consumer_1', null, null); DBMS_AQADM.REMOVE_SUBSCRIBER( queue_name => 'service_in_queue', subscriber => subscriber); END; /
- キューおよびキュー表を停止および削除するには:
7.4.2 Oracle AQアダプタのADTキュー
このサンプルでは、ビジネス・プロセスはAQアダプタからメッセージを受信し、ペイロードをアウトバウンド・メッセージにコピーし、アウトバウンド・メッセージを使用してAQアダプタを起動します。関係するキューはADTキューです。このシナリオでは、ユーザーがADT全体をペイロードとして使用するように選択しており、AQアダプタ・ウィザードではキュー構造に従ってSCOTT_CUSTOMER_TYPE.xsd
にスキーマが生成されています。実行時には、アダプタによりスキーマに一致するXMLファイルがメッセージごとに作成されます。
この項には次のトピックが含まれます:
7.4.2.1 前提条件
SCOTT
スキーマを持つデータベースへのアクセス権限が必要です。
この使用例を実行するには、まず次のファイルを作成し、次の順序で実行する必要があります:
-
setup_user.sql
-
create_type_customer.sql
-
create_queues.sql
-
enqueue_customer.sql
-
dequeue_customer.sql
setup_user.sql
の内容
grant connect to scott;
grant aq_administrator_role to scott;
create_type_customer.sql
の内容
create or replace type suite_arr as varray (5) of number;
/
create or replace type street_info as object ( street_name varchar2(100), street_num number, suites suite_arr );
/
create or replace type address_type as object ( street street_info, city varchar2(100), zip number, state varchar2(2), country varchar2(100) );
/
create or replace type phone as object ( country_code number, area_code number, dial number, last_dialed date );
/
create or replace type phone_arr as varray (10) of phone;
/
create or replace type contact_info as object ( phones phone_arr, email varchar2(100), web_address varchar2(256) );
/
create or replace type customer_type as object ( name varchar2(100), location address_type, sex char, age float,height DOUBLE PRECISION ,mark decimal , contacts contact_info, contract CLOB,tstamp TIMESTAMP );
/
create_queues.sql
の内容
begin
dbms_aqadm.create_queue_table('customer_in_table', 'customer_type'); dbms_aqadm.create_queue('customer_in_queue', 'customer_in_table');
dbms_aqadm.start_queue('customer_in_queue');
dbms_aqadm.create_queue_table('customer_out_table', 'customer_type'); dbms_aqadm.create_queue('customer_out_queue', 'customer_out_table');
dbms_aqadm.start_queue('customer_out_queue');
end;
/
enqueue_customer.sql
の内容
DECLARE
qname VARCHAR2(100);
enqueue_options dbms_aq.enqueue_options_t;
message_properties dbms_aq.message_properties_t;
msgid RAW(16);
contract_msg VARCHAR2(1000);
suites suite_arr;
str street_info;
addr address_type;
ph1 phone;
ph2 phone;
phs phone_arr;
ci contact_info;
cus customer_type;
BEGIN
qname := 'customer_in_queue';
suites := suite_arr(800, 900);
str := street_info('Oracle Parkway', 500, suites);
addr := address_type(str, 'Redwood Shores',94065, 'CA', 'USA');
ph1 := phone(1, 503, 5253190,to_date ('2004/04/02', 'yyyy/mm/dd'));
ph2 := phone(1, 503, 3297507,to_date ('040905', 'MMDDYY'));
phs := phone_arr(ph1,ph2);
ci := contact_info(phs, 'shashi@oracle.com', 'http://oracle.com');
cus := customer_type('Shashi', addr,'M',27.5,5.90,86.2, ci, 'my contract 12345678','20-JUL-05 04.11.58.000000 PM');
dbms_aq.enqueue(queue_name => qname,
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => cus,
msgid => msgid);
commit;
END;
/
dequeue_customer.sql
の内容
set serveroutput on;
DECLARE
enqueue_options dbms_aq.enqueue_options_t;
dequeue_options dbms_aq.dequeue_options_t;
message_properties dbms_aq.message_properties_t;
message_handle RAW(16);
msg_varchar varchar2(4000);
customer1 customer_type;
tempstr varchar2(200);
BEGIN
dequeue_options.wait:=180;
DBMS_AQ.DEQUEUE(
queue_name => 'CUSTOMER_OUT_QUEUE',
dequeue_options => dequeue_options,
message_properties => message_properties,
payload => customer1,
msgid => message_handle);
tempstr:=to_char(customer1.tstamp,'YYYY/MM/DD HH:MI:SS');
dbms_output.put_line('customer.name = "' || customer1.NAME || '"');
dbms_output.put_line('customer.location.street.street_name = "' || customer1.LOCATION.STREET.STREET_NAME || '"');
dbms_output.put_line('customer.location.street.street_num = "' || customer1.LOCATION.STREET.STREET_NUM|| '"');
dbms_output.put_line('customer1.LOCATION.CITY = "' || customer1.LOCATION.CITY|| '"');
dbms_output.put_line('customer1.LOCATION.ZIP = "' || customer1.LOCATION.ZIP|| '"');
dbms_output.put_line('customer1.LOCATION.STATE = "' || customer1.LOCATION.STATE|| '"');
dbms_output.put_line('customer1.LOCATION.COUNTRY = "' || customer1.LOCATION.COUNTRY|| '"');
dbms_output.put_line('customer.location.country = "' || customer1.location.country || '"');
dbms_output.put_line('customer.contract = "' || customer1.CONTRACT|| '"');
dbms_output.put_line('customer.name = "' || customer1.NAME || '"');
dbms_output.put_line('customer.location.street.street_name = "' || customer1.LOCATION.STREET.STREET_NAME || '"');
dbms_output.put_line('customer.location.street.street_num = "' || customer1.LOCATION.STREET.STREET_NUM|| '"');
dbms_output.put_line('customer.location.country = "' || customer1.location.country || '"');
dbms_output.put_line('customer.contract = "' || customer1.CONTRACT|| '"');
dbms_output.put_line('customer1.SEX = "' || customer1.SEX|| '"');
dbms_output.put_line('customer1.AGE = "' || customer1.AGE|| '"');
dbms_output.put_line('customer1.HEIGHT = "' || customer1.HEIGHT|| '"');
dbms_output.put_line('customer1.MARK = "' || customer1.MARK|| '"');
dbms_output.put_line('customer1.contract = "' || customer1.CONTRACT|| '"');
dbms_output.put_line('customer1.CONTACTS.EMAIL = "' || customer1.CONTACTS.EMAIL|| '"');
dbms_output.put_line('customer1.CONTACTS.WEB_ADDRESS = "' || customer1.CONTACTS.WEB_ADDRESS|| '"');
dbms_output.put_line('customer1.LOCATION.STREET.SUITES[1] = "' || customer1.LOCATION.STREET.SUITES(1) || '"');
dbms_output.put_line('customer1.LOCATION.STREET.SUITES[2] = "' || customer1.LOCATION.STREET.SUITES(2) || '"');
dbms_output.put_line('customer1.CONTACTS.PHONES(1).country_codE = "' || customer1.CONTACTS.PHONES(1).country_code|| '"');
dbms_output.put_line('customer1.CONTACTS.PHONES(1).area_code = "' || customer1.CONTACTS.PHONES(1).area_code || '"');
dbms_output.put_line('customer1.CONTACTS.PHONES(1).dial = "' || customer1.CONTACTS.PHONES(1).dial || '"');
dbms_output.put_line('customer1.CONTACTS.PHONES(1).last_dialed = "' || customer1.CONTACTS.PHONES(1).last_dialed || '"');
COMMIT;
END;
/
7.4.2.2 アプリケーションおよびSOAプロジェクトの作成
SOAコンポジットを含んだJDeveloperアプリケーションを作成する必要があります。アプリケーションとSOAプロジェクトを作成するステップは、次のとおりです:
7.4.2.3 インバウンドOracle AQアダプタの作成
次のステップに従ってインバウンドOracle AQアダプタ・サービスを作成します。
-
「コンポーネント」ウィンドウから「公開されたサービス」スイムレーンに「AQアダプタ」をドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
-
「サービス名」に入力し、「次へ」をクリックします。「サービス接続」ページが表示されます。
-
Oracle AQアダプタを構成するにはデータベース接続が必要です。新規接続を作成するか、既存のデータベース接続を選択できます。
-
「新規データベース接続を作成します。」アイコンをクリックしてデータベース接続を作成します。「データベース接続の作成」ページが表示されます。
-
「Oracle AQアダプタ・サービスの定義」のステップ4の説明に従って、データベース接続を作成します。
-
「OK」をクリックして新規データベース接続の作成プロセスを完了します。「サービス接続」ページが表示され、データベース接続のサマリーが示されます。
-
「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
-
「アダプタ・インタフェース」ページで、「操作およびスキーマから定義(後で指定)」を選択します。
-
「次へ」をクリックします。「操作」ページが表示されます。
-
「デキュー」を選択します。
-
デフォルトの操作名を受け入れて「次へ」をクリックします。
「キュー名」ページが表示されます。
-
リストからデータベース・スキーマを選択するか、「参照」をクリックしてスキーマを参照します。この例では、「参照」をクリックします。
「キューの選択」ダイアログが表示されます。
-
「キューの選択」ダイアログで、次のステップを実行します。
-
「キュー・タイプ」で「すべてのタイプ」を選択します。
-
「データベース・スキーマ」で「Scott」を選択します。
-
他の設定はデフォルト値のままにします。
-
「キュー」で「CUSTOMER_IN_QUEUE」を選択します。
図7-33に、「キューの選択」ダイアログを示します。
-
-
「OK」をクリックします。
すべてのフィールドに移入済の「キュー名」ダイアログが表示されます。
-
「次へ」をクリックします。「キュー・パラメータ」ページが表示されます。
-
「キュー・パラメータ」ページで、各フィールドを空白にしたままで「次へ」をクリックします。「オブジェクト・ペイロード」ページが表示されます。
-
「ビジネス・ペイロード」で、オブジェクト全体またはオブジェクト内の1つのフィールドのみのいずれかを選択します。
この例では「オブジェクトCUSTOMER_TYPE全体」を選択します。
-
「次へ」をクリックします。「JCAエンドポイント・プロパティ」ページが表示されます。
「参照構成」オプションを選択した場合、「JCAエンドポイント・プロパティ」画面が表示されます。詳細は、「アダプタ構成ウィザードのJCAエンドポイント・プロパティ」を参照してください。
-
「次へ」をクリックします。「終了」ページが表示され、ウィザードによって作成されるアダプタ・ファイルのパスと名前が示されます。
-
「終了」をクリックします。
インバウンドOracle AQアダプタの定義が完了しました
7.4.2.4 アウトバウンドOracle AQアダプタの作成
次のステップに従ってアウトバウンドOracle AQアダプタ・サービスを作成します。
-
「コンポーネント」ウィンドウの「サービス・アダプタ」リストから、「AQアダプタ」をcomposite.xmlページ内の「公開されたサービス」スイムレーンにドラッグ・アンド・ドロップします。「アダプタ構成ウィザード」が表示されます。
-
「サービス名」フィールドに
enqueue
と入力し、「次へ」をクリックします。「サービス接続」ページが表示されます。
-
「接続」で、「MyConnection」を選択して「次へ」をクリックします。
「アダプタ・インタフェース」ページが表示されます。
-
「アダプタ・インタフェース」ページで、「操作およびスキーマから定義(後で指定)」を選択し、「次へ」をクリックします。
「操作」ページが表示されます。
-
「操作」ページで、「エンキュー」を選択してデフォルトの操作名を受け入れます。
-
「次へ」をクリックします。
「キュー名」ページが表示されます。
-
「キュー名」ページで、リストからデータベース・スキーマを選択するか、「参照」をクリックしてスキーマを参照します。この例では、「参照」をクリックします。
「キューの選択」ダイアログが表示されます。
-
「キューの選択」ダイアログで、次のステップを実行します。
-
「キュー・タイプ」で「すべてのタイプ」を選択します。
-
「データベース・スキーマ」で「Scott」を選択します。
-
他の設定はデフォルト値のままにします。
-
「キュー」で「CUSTOMER_OUT_QUEUE」を選択します。
-
-
「OK」をクリックします。
すべてのフィールドに移入済の「キュー名」ページが表示されます。
-
「次へ」をクリックします。
「キュー・パラメータ」ページが表示されます。
-
「キュー・パラメータ」ページで、各フィールドを空白にしたままで「次へ」をクリックします。
「オブジェクト・ペイロード」ページが表示されます。
-
「ビジネス・ペイロード」で、オブジェクト全体またはオブジェクト内の1つのフィールドのみのいずれかを選択します。この例では「オブジェクトCUSTOMER_TYPE全体」を選択します。
-
「次へ」をクリックします。
「終了」画面が表示されます。このページには、ウィザードにより作成されるアダプタ・ファイルのパスと名前が表示されます。
-
「終了」ウィンドウで「終了」をクリックします。
アウトバウンドOracle AQアダプタの定義が完了しました。
7.4.2.5 サービスとアクティビティのワイヤリング
作成した3つのコンポーネント(インバウンド・アダプタ・サービス、メディエータ・コンポーネントおよびアウトバウンド・アダプタ参照)をアセンブルまたは接続する必要があります。コンポーネントを接続するステップは、次のとおりです。
7.4.2.8 JDeveloperを使用したデプロイ
前述のステップで作成したSOAプロジェクトおよびアプリケーションについて、アプリケーション・プロファイルをデプロイする必要があります。JDeveloperを使用してアプリケーション・プロファイルをデプロイするには、次のステップを実行する必要があります。
- アプリケーション・サーバー接続を作成します。詳細は、「Oracle JCAアダプタ用のアプリケーション・サーバー接続の作成」を参照してください。
- アプリケーションをデプロイします。詳細は、「JDeveloperからのOracle JCAアダプタ・アプリケーションのデプロイ」を参照してください。
7.4.2.9 Oracle Fusion Middleware Controlコンソールを使用した監視
Fusion Middleware Controlコンソールを使用して、デプロイ済のコンポジットを監視できます。次のステップを実行します。
http://servername:portnumber/em
にナビゲートします。デプロイしたコンポジットがアプリケーション・ナビゲータに表示されます。- 最後の5つのインスタンス・ペインに、新規インスタンスのエントリがあります。この新規インスタンスは、メッセージをエンキューするときにトリガーされたインスタンスです。
- インスタンスをクリックします。「フローのトレース」ページが表示されます。
- 「Mediator1」コンポーネント・インスタンスをクリックします。「監査」ページが表示されます。
- 「フロー - デバッグ」タブをクリックしてインスタンスをデバッグします。
7.4.3 Oracle AQアダプタのRAWキュー
この使用例では、Oracle AQアダプタを使用してAQ RAWキューとの間のデキューとエンキューを実行する方法について説明します。
この項には次のトピックが含まれます:
7.4.3.1 前提条件
SCOTT
スキーマを持つデータベースへのアクセス権限が必要です。
この使用例を実行するには、まず次のファイルを作成し、次の順序で.sql
ファイルを実行する必要があります:
-
setup_user.sql
-
create_queues.sql
-
enqueue_raw.sql
-
dequeue_raw.sql
-
emp.xsd
setup_user.sql
の内容
grant connect, resource to scott;
grant aq_administrator_role to scott;
create_queues.sql
の内容
begin
DBMS_AQADM.CREATE_QUEUE_TABLE ( queue_table => 'RAW_IN_QUEUE_TABLE', queue_payload_type => 'RAW');
DBMS_AQADM.CREATE_QUEUE ( queue_name => 'RAW_IN_QUEUE', queue_table => 'RAW_IN_QUEUE_TABLE');
DBMS_AQADM.START_QUEUE ( queue_name => 'RAW_IN_QUEUE');
DBMS_AQADM.CREATE_QUEUE_TABLE ( queue_table => 'RAW_OUT_QUEUE_TABLE', queue_payload_type => 'RAW');
DBMS_AQADM.CREATE_QUEUE ( queue_name => 'RAW_OUT_QUEUE', queue_table => 'RAW_OUT_QUEUE_TABLE');
DBMS_AQADM.START_QUEUE ( queue_name => 'RAW_OUT_QUEUE');
end;
/
enqueue_raw.sql
の内容
DECLARE
enqueue_options dbms_aq.enqueue_options_t;
message_properties dbms_aq.message_properties_t;
message_handle RAW(16);
msg_in raw(2000);
msg_varchar varchar2(4000);
BEGIN
msg_varchar := '<AqRaw_End2End xmlns="http://www.oracle.com/aqSample/Raw">
<EMPS>
<ID>34</ID>
<EMP>
<YEARS>21</YEARS>
<NAME>john doe</NAME>
</EMP>
</EMPS></AqRaw_End2End>';
msg_in := utl_raw.cast_to_raw(msg_varchar);
dbms_aq.enqueue(queue_name => 'raw_in_queue', enqueue_options => enqueue_options, message_properties => message_properties, payload => msg_in, msgid => message_handle);
commit;
END;
/
dequeue_raw.sql
の内容
DECLARE
enqueue_options dbms_aq.enqueue_options_t;
dequeue_options dbms_aq.dequeue_options_t;
message_properties dbms_aq.message_properties_t;
message_handle RAW(16);
msg_in raw(2000);
msg_out raw(2000);
msg_varchar varchar2(4000);
BEGIN
dequeue_options.wait:=180;
DBMS_AQ.DEQUEUE(
queue_name => 'RAW_OUT_QUEUE',
dequeue_options => dequeue_options,
message_properties => message_properties,
payload => msg_out,
msgid => message_handle);
msg_varchar := utl_raw.cast_to_varchar2(msg_out);
dbms_output.put_line('Payload = "' || msg_varchar || '"');
insert into temp_raw values(msg_varchar);
COMMIT;
END;
/
emp.xsd
の内容
<?xml version= '1.0' encoding= 'UTF-8' ?>
<schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://www.oracle.com/aqSample/Raw"
xmlns="http://www.w3.org/2001/XMLSchema" xmlns:AQAPP="http://www.oracle.com/aqSample/Raw">
<complexType name="EMPS">
<sequence>
<element minOccurs="0" name="ID" type="double"/>
<element minOccurs="0" name="EMP" type="AQAPP:EMP_TYPE"/>
</sequence>
</complexType>
<complexType name="EMP_TYPE">
<sequence>
<element minOccurs="0" name="YEARS" type="double"/>
<element minOccurs="0" name="NAME" type="string"/>
</sequence>
</complexType>
<element name="AqRaw_End2End">
<complexType>
<sequence>
<element name="EMPS" type="AQAPP:EMPS"/>
</sequence>
</complexType>
</element>
</schema>
7.4.3.2 アプリケーションおよびSOAプロジェクトの作成
SOAコンポジットを含んだJDeveloperアプリケーションを作成する必要があります。アプリケーションとSOAプロジェクトを作成するステップは、次のとおりです:
7.4.3.4 アウトバウンド・アダプタ・サービスの作成
リクエスト・メッセージをエンキューし、対応するレスポンス・メッセージ(レポート)をキューからデキューするアダプタ・サービスを作成するステップは、次のとおりです。
7.4.3.5 サービスとアクティビティのワイヤリング
作成した3つのコンポーネント(インバウンド・アダプタ・サービス、BPELプロセスおよびアウトバウンド・アダプタ参照)をアセンブルまたは接続する必要があります。コンポーネントを接続するステップは、次のとおりです。
7.4.3.7 JDeveloperを使用したデプロイ
前述のステップで作成したSOAプロジェクトおよびアプリケーションについて、アプリケーション・プロファイルをデプロイする必要があります。JDeveloperを使用してアプリケーション・プロファイルをデプロイするには、次のステップを実行する必要があります。
- アプリケーション・サーバー接続を作成します。詳細は、「Oracle JCAアダプタ用のアプリケーション・サーバー接続の作成」を参照してください。
- アプリケーションをデプロイします。詳細は、「JDeveloperからのOracle JCAアダプタ・アプリケーションのデプロイ」を参照してください。