OSGi 拡張・BPM/EIP 連携

標準アプリやスクリプトで足りない高度な拡張は、OSGi バンドルで追加できます。また、BPM・EIP のランタイムは OSGi EventAdmin にイベントを発行しており、バンドル・スクリプト・Camel ルートから連携できます。

OSGi バンドルの構成

バンドルは次のような構成です。

com.example.myfeature/
├── META-INF/MANIFEST.MF      # OSGi バンドルのメタデータ
├── OSGI-INF/*.xml            # Declarative Services(DS)コンポーネント定義
├── src/...                   # Java ソース
└── build.properties

MANIFEST.MF では、シンボリック名・バージョン・依存(Import-Package / Require-Bundle)・公開 API(Export-Package)・DS コンポーネント(Service-Component)を宣言します。DS コンポーネント(OSGI-INF/*.xml)は、必要なサービスを <reference> で受け取り、すべて揃うと自動で起動します。

<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.3.0"
    immediate="true" name="com.example.myfeature.MyService">
  <reference cardinality="1..1" field="fRepository"
      interface="javax.jcr.Repository" name="fRepository" policy="static"/>
  <implementation class="com.example.myfeature.internal.MyService"/>
</scr:component>

バンドルは Felix が起動時に読み込みます。実行中の管理・確認は OSGi Console/docs/user-guide/osgi-console/)から行えます。

BPM / EIP の EventAdmin 連携

BPM・EIP の両エンジンは、ランタイムのライフサイクルを OSGi EventAdmin に発行します。トピックとプロパティの規約は共通で、すべてのイベントに workspace プロパティが付きます(運用面の概要は「BPM / EIP 構成」を参照)。

  • トピック: <fully/qualified/Type>/<ACTION>(完全修飾型名の ./、末尾に大文字のアクション)
  • 例: org/camunda/bpm/engine/task/Task/CREATEDorg/apache/camel/Exchange/FAILED
  • 配信は非同期(postEvent)。BPM はトランザクションのコミット時にのみ発行

eventadmin: Camel コンポーネント

Camel ルートから、EventAdmin イベントを消費生成できます。

イベントを消費する:

from("eventadmin:org/camunda/bpm/engine/runtime/ProcessInstance/*?filter=(workspace=web)")
    .to("log:bpm-notifications");

エンドポイントは eventadmin:<topic>?filter=<LDAPフィルター> の形式で、トピックはワイルドカード、フィルターは workspace 等で絞り込めます。内部では OSGi の EventHandler を登録します。

イベントを生成する:

from("...")
    .to("eventadmin:org/my/custom/Event/TRIGGERED");

メッセージボディが Map の場合はそれがイベントプロパティになり、TOPIC ヘッダーでトピックを上書きできます。

プロセス・ルートとの連携

  • プロセスを開始 — GraphQL の startProcess ミューテーション、または ProcessEngine の API
  • ルートへ送信CamelContextProducerTemplate#sendBody(endpointUri, body)、または GraphQL の sendToEndpoint
  • アクティビティに反応 — EventAdmin トピックを購読(OSGi EventHandler、Camel from("eventadmin:...")、または GraphQL 購読)

サービスアカウントでの自動処理

連携処理は、パスワードを持たないサービスアカウントとして権限を与えるのが安全です。プロビジョニングで作成し、グループ経由で ACL を付与します。

users:
  - id: myapp-service
    service: true
    displayName: MyApp Integration
    memberOf: [myapp-service-group]
groups:
  - id: myapp-service-group
    displayName: MyApp Service Users
nodes:
  - path: /content/myapp
    primaryType: nt:folder
    acl:
      - group: myapp-service-group
        privileges: jcr:read, jcr:write
        effect: allow

詳しくは「プロビジョニング」と「ユーザー・ロール・権限」を参照してください。