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/CREATED、org/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 - ルートへ送信 —
CamelContextのProducerTemplate#sendBody(endpointUri, body)、または GraphQL のsendToEndpoint - アクティビティに反応 — EventAdmin トピックを購読(OSGi
EventHandler、Camelfrom("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
詳しくは「プロビジョニング」と「ユーザー・ロール・権限」を参照してください。