11 Replies Latest reply: Aug 27, 2012 10:44 AM by 935661 RSS

    OSB を介して BPM suite 間の非同期接続

    935661
      こんにちは。

      今、BPM suite を使ってプロセス間の非同期接続を調査しています。今想定しているのは、BPM Server 間に更にOSBを介して3ノードを非同期で通信できないかを試しています。

      Diagram

      OSB や BPM の Cookbook を見る限りでは、OSB のトランスポートに SOA-DIRECT、sb を使用し、呼び元の BPM プロセスは CatchEvent を使用するのかと思っていました。しかしながらその組み合わせだと呼び元のCallbackの指定の際に Endpoint URI がどちら向きに参照するべきなのかがよくわからなくなっています。色々サンプル等を探してみたのですが、こういった接続を実現しているような情報がなくこちらに投稿させてもらいました。

      そもそもSOA-DIRECTを使わないというやり方もあるのかもしれませんが、Oracle の製品を標準で使うとどうなるのかについてちょっと知っておきたいと思っています。
        • 1. Re: OSB を介して BPM suite 間の非同期接続
          A.Nishi-Oracle
          etsu60 さん、こんにちは。

          etsu60さんの意図されている非同期接続とは、非同期処理の待ち合わせですね。
          TwitPicにUpされた図を拝見する限り、以下のようなことを実現したいのかな、と理解しました。
          <ul>
          <li>親、子のプロセスとも非同期プロセスである。</li>
          <li>親プロセスから子プロセスを非同期で呼び出す。親プロセスは後続処理を続行する(親、子プロセスは並行して動作)。</li>
          <ul>
          <li>親プロセスー子プロセス間はOSBが仲介する。</li>
          <li>各プロセス間はRMI呼び出し(SBトランスポート、SOA-DIRECTトランスポートの利用)。</li>
          </ul>
          <li>子プロセスのメッセージを親プロセスが待ち受ける。待ち受けた後、親プロセスは処理を続行する。</li>
          </ul>
          で、各コンポーネントの設定ですが…
          <ul>
          <li>BPMプロセスの設定
          図に記載されているように、Throwイベント(もしくは送信アクティビティ)で子ノードのプロセスへメッセージを送出、Catchイベント(もしくは受信アクティビティ)で子ノードのメッセージを待ち受ける設定でOKです。
          BPMプロセスに入ってくる(返ってくる)メッセージなので、Catchイベント(もしくは受信アクティビティ)を使います。
          待ち合わせ時のために相関の設定をお忘れなく。</li>
          <li>OSBの設定
          いずれもOne-wayの呼び出しですね。
          図に記載されているように、呼び出し側(メッセージ送出側)がプロキシサービス、呼び出される側(メッセージ受信側)がビジネスサービスの位置づけです。
          </li>
          </ul>
          SBトランスポートやSOA-DIRECTトランスポートを使う場合、コンポジットエディタでBPMプロセスのエンドポイントを直接バインディングを使う構成に変更する必要があるので、ご注意下さい。

          1点気になったのは、OSBとBPMプロセスの連係でSOA-DirectトランスポートとSBトランスポートを使おうとされているところです。
          SOAコンポジットに複数のプロセスを配置すれば、OSBを介さずに内部呼び出しできるのですが…。
          何らかのポリシーが原因で、コンポジット内に1個のプロセスしか配置できないのでしょうか。
          • 2. Re: OSB を介して BPM suite 間の非同期接続
            935661
            a_nishi さん ご返答ありがとうございます。Replyが遅くなり恐縮です。

            a_nishi さんの想定でやりたい事は大体合っております。親と子のプロセスのライフサイクルが異なり、子の返答が相当時間がかかるプロセス呼び出しになることが想定されているので、親・子ともに非同期処理を想定しています。
            コンポジットエディタでBPMプロセスのエンドポイントを直接バインディングを使う構成に変更する必要があるので、ご注意下さい。
            なるほどこれは Cookbook では示されていない情報のようですね。助かります。ご返答を頂いていまの方向性で進められるのか自信がなかったので少し安心しました。この接続について、今悩んでいる点は他に

            (1)子プロセス側で作成の必要がある直接バインディングが二つ(start と Callback)あるが、それぞれが使用する WSDL についてどう用意するのか。特に Callback の WSDL はどのように用意する事になるのかな。
            (2)OSB内部でプロキシサービス2つとビジネスサービス2つできる想定だがそれぞれの EndPointURI がどのような記述になるのか。

            ここらへんが解決すると疎通が可能になるのかなぁ。ちなみに
            SOAコンポジットに複数のプロセスを配置すれば、OSBを介さずに内部呼び出しできるのですが…。
            そうですよね。プロセス同士の直接呼び出しについては挙動は確認しております。業務上ちょっと難しい要件があり、それを実現しようとするとプロセス間になんらかしらかの緩衝材的なものを用意する必要があり ESB を用いようかと思っておりまず OSB でどうやるのかを試しております。
            • 3. Re: OSB を介して BPM suite 間の非同期接続
              A.Nishi-Oracle
              etsu60さん
              (1)子プロセス側で作成の必要がある直接バインディングが二つ(start と Callback)あるが、それぞれが使用する WSDL についてどう用意するのか。特に Callback の WSDL はどのように用意する事になるのかな。
              シンプルなのは、ビジネスサービス側のWSDLを用意し、OSBを介して呼び出すことでしょう。
              <ul>
              <li>親から子の場合、子のWSDL(Start)を基にOSBのビジネスサービス、プロキシサービスを作成し、親のThrowEventでは子のプロキシサービスを呼び出す。</li>
              <li>子から親の場合、親のWSDL(CatchEvent)を基にOSBのビジネスサービス、プロキシサービスを作成し、子のCallbackから親のプロキシサービスを呼び出す。</li>
              </ul>
              OSBは既存のWSDLからプロキシサービス、ビジネスサービスを作ることができますので、もし子のEndPoint(Start/CallBack)が定義済みなら、子のWSDLだけを使ってプロキシサービス、ビジネスサービスを作ることもできます。
              (2)OSB内部でプロキシサービス2つとビジネスサービス2つできる想定だがそれぞれの EndPointURI がどのような記述になるのか。
              まさにこの辺りを記載しているエントリがありますね。
              <blockquote>[SOA] Native call between BPEL PM/Mediator and OSB
              http://orablogs-jp.blogspot.jp/2012/07/native-call-between-bpel-pmmediator-and.html</blockquote>
              OSBからBPMプロセスを呼び出すSOA-DIRECTトランスポートでは、SOAコンポジットの以下のようなEndpoint URIを使ってビジネスサービスを作成します。
              <blockquote>soadirect t3://{Host}:{Port}/domainName/compositeName[!compositeVersion[*label]]/serviceName</blockquote>
              ここで、domainNameはSOAパーティションの名前、compositeNameはSOAコンポジット名、serviceNameはコンポジット内のサービス名です。
              詳細は以下のドキュメントをどうぞ。
              <blockquote>Oracle® Fusion Middleware Oracle Service Bus開発者ガイド 11gリリース1 (11.1.1.6.0)
              SOA-DIRECTのエンドポイントURI
              http://docs.oracle.com/cd/E28389_01/dev.1111/b61435/soa.htm#BABJAEFJ</blockquote>

              BPMプロセスからOSBのプロキシサービスを呼び出す場合、SBトランスポートを使いますが、SBトランスポートの場合、EndPoint URIは以下のフォーマットに従います。
              <blockquote>sb://host:port/service_name</blockquote>
              ここで、hostはプロキシ・サービスをホスティングしているOracle Service Busサーバーのホスト名、portはリスニング・ポートです。
              詳細は以下のドキュメントをどうぞ。
              <blockquote>Oracle® Fusion Middleware Oracle Service Bus開発者ガイド 11gリリース1 (11.1.1.6.0)
              SBトランスポート
              http://docs.oracle.com/cd/E28389_01/dev.1111/b61435/sb.htm</blockquote>

              Edited by: a_nishi on 2012/07/25 11:16
              • 4. Re: OSB を介して BPM suite 間の非同期接続
                935661
                a_nishi さん ご返答ありがとうございます。

                すごくわかり易かったです。大体どのように指定すれば良いかがわかりました。バインディングの所がちゃんと整理出来ていなかったので CatchEvent の WSDL を使う所などは気がつかなかったので、非常に助かりました。これで早速、試してみたのですが子プロセスを呼び出すビジネスサービスの設定で恥ずかしながら止まっています。子プロセスの WSDL を元にビジネスサービスを作成すると WSDL の wsdlsoap:address のlocation に t3 で始まっている URI 記載が入っており、取り込み直後は Existing URIs にそのまま入っています。これを説明にあったように
                soadirect:/default/ChildProcess!1.0/ChildASyncProcessDirectService
                と変更したら
                The URI scheme "soadirect" is not recognized as a supported protocol.
                と OEPE から怒られてしまいました。BPM Suite はスタックミドルウェアなので、バージョンには細心の注意をしてインストールしているつもりで、先ほど(07/25)もサイトの最新を確認したところやはり同じバージョンを使っていました。なお OEPE で使われている Oracle Service Bus Tooling は 1.4.0 でした。
                • 5. Re: OSB を介して BPM suite 間の非同期接続
                  A.Nishi-Oracle
                  etsu60さん
                  一点間違いがありました。
                  t3://...というところをsoadirect:/に変更されたということですが、soadirect:/はサービスパスなので、t3://のままでOKです。
                  失礼しました。
                  あと、ビジネスサービスのBPMプロセスがクラスタ上で動作している場合は、OEPEもしくはWebコンソールから、EndPoint URIとして、
                  t3://{Host1}:{Port1},...,{HostN}:{PortN}/domainName/compositeName[!versionNumber[*label]]/serviceName
                  のように設定してみて下さい。
                  • 6. Re: OSB を介して BPM suite 間の非同期接続
                    935661
                    ご返答ありがとうございます。

                    設定を間違えていた点が何か所かあったので確認に時間がかかっております。相関の指定をそもそも忘れておりました。
                    # 元々 WS-Addressing を使う事を念頭に置いていたので勘違いをしていました。

                    結果は、後ほどここに書かせてもらいます。

                    Edited by: etsu60 on 2012/08/01 10:51
                    • 7. Re: OSB を介して BPM suite 間の非同期接続
                      935661
                      ご無沙汰しております。別件で時間が取れなかったので返答までに時間がかかってしまいました。

                      結論だけいうと未だ接続出来おりません。お恥ずかしい...とりあえず現状の状況は、
                      (1)親プロセスからOSBの呼び出しを実行
                      (2)OSBから子プロセスを実行
                      (3)子プロセスをend まで呼び出すことも出来た
                      (4)子プロセスがOSBを呼び出す際にエラー発生。以下のようなエラーが子プロセス発生しています。OSBには返信出来ませんでした。
                      <auditQueryPayload auditId="77002" ciKey="150001">
                      <dataState>
                      <dataObject name="FaultMessage" isBusinessIndicator="false">
                      <value> com.oracle.bpel.client.BPELFault: faultName: {{http://schemas.oracle.com/bpel/extension}remoteFault} messageType: {{http://schemas.oracle.com/bpel/extension}RuntimeFaultMessage} parts: {{ summary=<summary>oracle.fabric.common.FabricInvocationException: oracle.fabric.common.FabricInvocationException: oracle.soa.api.invocation.InvocationException: com.bea.wli.sb.transports.client.SBConnectionException: Could not create connection, verify that protocol is supported or enabled, provider uri and credentials are correct.</summary> ,detail=<detail>[Security:090398]無効なサブジェクト: principals=[weblogic, Administrators]</detail> ,code=<code>null</code>} </value>
                      </dataObject>
                      </dataState>
                      </auditQueryPayload>
                      メッセージを見る限りだと code が null だからという点で色々調べていたのですがこれに相当するのが見つけられなったのが現状でした。Proxy側の設定として、Callback Proxy や Invocation Service Account の設定もしています。子プロセスは非同期プロセスなので、end のままです。まだしっくりこない点としては、

                      子プロセスの end にて親の CatchEvent に対する OSB の Serivce Proxy を指定する方法ですね。共有して頂いた内容ですと親の CatchEvent のプロキシをOSBで作成する事になるかと思います。その上でサービスプロキシに対して子プロセスの composite.xml にて外部参照として直接バインディングを作成する事になると想定しています。end で指定できるメッセージ交換タイプは、「インターフェイスの使用」「インターフェイスの定義」であり、「サービス・コール」が選択できず、そもそも作成した直接バインディングを end で指定出来ないようにも見えます。

                      なお、子プロセスの end のあたりを色々と変更しながら模索していますが、上手くいかないというのが現状になります。メッセージは若干異なりますが同じ個所(子プロセスのend)でエラーが発生していますね。

                      Edited by: etsu60 on 2012/08/07 7:04
                      • 8. Re: OSB を介して BPM suite 間の非同期接続
                        A.Nishi-Oracle
                        返信が遅くなりました。
                        子プロセスの end にて親の CatchEvent に対する OSB の Serivce Proxy を指定する方法ですね。共有して頂いた内容ですと親の CatchEvent のプロキシをOSBで作成する事になるかと思います。その上でサービスプロキシに対して子プロセスの composite.xml にて外部参照として直接バインディングを作成する事になると想定しています。end で指定できるメッセージ交換タイプは、「インターフェイスの使用」「インターフェイスの定義」であり、「サービス・コール」が選択できず、そもそも作成した直接バインディングを end で指定出来ないようにも見えます。
                        OSBで非同期コールバックを実現するには、以下のように大きく2つのやり方があります。
                        <ol>
                        <li>一方向のインターフェースを実現するよう、プロキシ/ビジネスサービスを構成する</li>
                        <li>OSBの非同期コールバック機能を使う</li>
                        </ol>
                        1.の場合はOSB内では特段の設定は不要ですが、一方向インターフェースが増加する傾向があります。また、親・子プロセスで次のような設定が必要です。
                        <ul>
                        <li>親プロセスで相関を設定する必要がある(2の方式でも同様)</li>
                        <li>親から子を呼び出すときは一方向のサービスを呼び出すように設定し、子プロセスからのコールバックを受けるため、start/end以外に別途オペレーションを追加する必要がある。</li>
                        <li>子プロセスでは、Service、Referenceに直接バインディングを設定しておく必要がある</li>
                        </ul>
                        2.の場合、OSBで以下のような設定をする必要がありますが、子プロセスはOSBから呼び出され、OSBに応答を返す形でよく、バインディングだけ直接バインディングに変更する必要があります。
                        <ul>
                        <li>親から子を呼び出すプロキシサービスで、子プロセスがコールバックする宛先(子から親へコールバックするプロキシサービスのURL)と、本来の親プロセスへのコールバック先を渡す。</li>
                        <li>子から親へ返すプロキシサービスで、あらかじめ設定しておいた親プロセスの本来のコールバック先を、ルーティングオプションアクションを使ってビジネスサービスに渡し、親プロセスを呼び出す。</li>
                        </ul>

                        2.の方法を採用されるのであれば、実際に動作するコードがチュートリアルの形式でUpされていましたので、一度動作を確認頂くのはいかがでしょう。
                        このチュートリアルではBPELプロセスを使っていますが、非同期プロセスの扱いは同じなので、参考になるかと思います。

                        OSB 11G ASYNCHRONOUS REQUEST RESPONSE WITH 11GR1 SOA COMPOSITE
                        http://soaranch.wordpress.com/2010/10/02/osb-11g-asynchronous-request-response/
                        • 9. Re: OSB を介して BPM suite 間の非同期接続
                          935661
                          返信が遅くなりました。

                          結論から言うと 2 の方法を元に実行を確認する事が出来ました。SOA-Directを使った場合でもやはり WSA Header 意図的に変更しないといけないのですね。それを受け入れたら色々と自由度が広がったので方法が理解出来ました。

                          それと以下の点は少し上手くいかなかったので情報共有としてメモさせてください。環境依存などによるかもしれませんが念のため記載しておきます。

                          1. 子プロセス側に直接バインディングから呼び出した際にはリプライ時にどうしてもエラーが発生していた。
                          2. 親プロセスを非同期で作成した場合には成功したが、親プロセスを同期型で指定した場合には、親側 CatchEvent で Timeout エラーが発生した。

                          最後に丁寧な回答を頂けた事非常に感謝しております。ありがとうございました。
                          • 10. Re: OSB を介して BPM suite 間の非同期接続
                            A.Nishi-Oracle
                            ご連絡ありがとうございます。
                            無事に接続・連係できたとのことで何よりです。
                            頂いた現象について回答すると…
                            1. 子プロセス側に直接バインディングから呼び出した際にはリプライ時にどうしてもエラーが発生していた。
                            これは子プロセスからOSBにレスポンスを返したものの、ビジネスサービスのルーティング先がわからないために、ルーティング失敗でエラーが子プロセスに返ったものと考えられます。
                            2. 親プロセスを非同期で作成した場合には成功したが、親プロセスを同期型で指定した場合には、親側 CatchEvent で Timeout エラーが発生した。
                            同期型の場合、JTAのタイムアウトが発生した可能性があります。デフォルト設定の場合、タイムアウトは30秒になっています。
                            設定変更にあたっては、以下のドキュメントを参考にして下さい。ただ、このタイムアウト値はドメイン全体に影響します。設定にあたってはご注意下さい。

                            Oracle® Fusion Middleware Oracle SOA SuiteおよびOracle Business Process Management Suite管理者ガイド 11g リリース1 (11.1.1.6.0)
                            接続およびトランザクション・タイムアウトのトラブルシューティング
                            http://docs.oracle.com/cd/E28389_01/admin.1111/b55916/appx_trouble.htm#BABDEGHA

                            Oracle® Fusion Middleware Administrator's Guide for Oracle SOA Suite and Oracle Business Process Management Suite 11g Release 1 (11.1.1.6.3)
                            Connection and Transaction Timeout Troubleshooting
                            http://docs.oracle.com/cd/E23943_01/admin.1111/e10226/appx_trouble.htm#BABDEGHA
                            • 11. Re: OSB を介して BPM suite 間の非同期接続
                              935661
                              重ね重ねありがとうございます。以下マニュアルを確認しようと思っていたところでしたので助かります。手厚いフォローありがとうございました。
                              Oracle® Fusion Middleware Oracle SOA SuiteおよびOracle Business Process Management Suite管理者ガイド 11g リリース1 (11.1.1.6.0)
                              接続およびトランザクション・タイムアウトのトラブルシューティング
                              http://docs.oracle.com/cd/E28389_01/admin.1111/b55916/appx_trouble.htm#BABDEGHA