2014年以来、内部システム間の統合と相互作用が導入され、Oracle SOA Suiteを中心としたOracle Fusion Middleware製品スタックである産業用ミドルウェアに移行されました。 この製品は高度に専門化されており、ロシア語の資料はほとんどありません。 Exchangeのブログでは、SOA Suiteの実装に関連する調査結果と発見について定期的に話す予定です。 ここで本格的なコースが登場することを期待するべきではありません。むしろ、明確に定式化されたレシピが見つからなかったさまざまな問題のトピックに関するメモになり、結果を他の専門家と共有したいと思います。 各記事で、読者が自分自身にとって新しく有用なものを見つけられることを願っています。
SOA Suite製品の最新バージョン12cでは、Oracleは便利なものを実装しました-Enterprise Managerコントロールパネルでは、複合アプリケーションの個別のインスタンスの代わりに、実行可能なチェーン(公式ドキュメントで呼ばれるビジネスフロー)が表示され始めました。 しかし、多数のアプリケーションを同時に実行する場合、複合アプリケーションまたはチェーンの適切なインスタンスを見つけるという問題は依然として残っています。
この状況での一般的な解決策は、チェーンの名前(フロー名)を使用して情報を反映し、チェーンを処理するデータに一意に関連付けることです。 通常、これらは識別子、名前、送信されたメッセージの参照です。 コントロールパネルを使用すると、標準のLIKE SQL構成テンプレートを含む名前で選択をフィルタリングできます。
チェーンの名前を示すために、oraext関数が存在します:setFlowInstanceTitle()。 たとえば、Assign Activityで使用できます(図1)。
<名前の割り当て= "AssignFlowName"> <コピー> <from> oraext:setFlowInstanceTitle(string($ inputVariable.payload / client:name))</ from> <to> $ outputVariable.payload / client:name </ to> </ copy> </ assign>
図1.チェーン名を指定する関数。

ora:setCompositeInstanceTitle( )関数を使用して1つの複合アプリケーション(チェーン全体ではなく)の名前を指定する機能も残っていますが、チェーンに名前を付ける機能があるため、すでに完全に興味がありません(そしてこの記事で後ほど説明しません)。
ただし、これらの機能は両方とも、インストールされたパッチ#18310693で機能します(パッチ#20900599の作成時に後者に含まれる:SOAバンドルパッチ12.1.3.0.3)。 サーバーをまだ更新していない場合は、Java Embeddingからの呼び出しのみが機能します。
<extensionActivity> <bpelx:exec name = "JavaFlowName" language = "java"> <![CDATA [setFlowInstanceTitle((String)getVariableData( "titleVar"));]]> </ bpelx:exec> </ extensionActivity>
添付のアーカイブには、名前を示す両方のオプションを備えた複合アプリケーションの例が含まれています。 Webサービス入力に渡される文字列は、上記の両方の方法でチェーン名として割り当てられます(Java埋め込みオプションの場合、スキップフラグ<bpelx:skipCondition> true()</ bpelx:skipCondition>が設定されます )。 アプリケーションをサーバーにダウンロードし、Enterprise Managerに組み込まれているテストツールを使用して名前を試すことができます(図2、3)。
図2. Enterprise Managerでの複合アプリケーションの呼び出し。

図3.指定された名前のチェーン。

100文字を超える文字列を渡すと、複合アプリケーションはエラーでクラッシュします。
ORA-12899:列「DEV12C_SOAINFRA」、「SCA_FLOW_INSTANCE」、「TITLE」の値が大きすぎます(実際:101、最大:100)
(この場合、DEV12CはSOA Suiteのインストール中に指定されたシステム回路のプレフィックスです)。
はい、はい、すべてが正しいです。法的APIを使用すると、基本的な方法でアプリケーションを中断できます。SOASuiteは、チェーン名を格納するための100文字のフィールドを確保します。 そして、残念なことに、このケースだけではありません。 オーバーフローしたテキストフィールドのいくつかのシナリオは、それらの値が体系的な方法で生成される場合(ユーザー入力とは無関係)を含むことが知られています。
この種のエラーに対するOracleサポートの典型的な対応:データベースのフィールドを展開します。 一部のエラーは以前のバージョン11gで既に知られており、バージョン12cに正常に移動したため、体系的な方法でエラーを解決しようとすることは無意味です。 したがって、サーバーの安定した動作を保証するには、パッチをインストールする必要があります。 私たちの回路では:
- 100文字はまだ非常に小さいため、問題フィールドの値を256文字に拡張しました。
- すべての割り当てで、サブストリング()でテキスト文字列をさらにトリミングします。
<名前の割り当て= "AssignFlowName"> <コピー> <from> oraext:setFlowInstanceTitle(substring(string($ inputVariable.payload / client:name)、1、256))</ from> <to> $ outputVariable.payload / client:name </ to> </ copy> </ assign>
最も信頼できるソリューションは、SOA Suiteの特別な拡張機能を実装することです。SOASuite自体は、必要な長さ制御を実行し、それのみを使用します。 これについては、NSD統合システム開発部門の統合責任者であるAlexander Khoroshilovが今後の記事で説明します。