13.2. OSGi

OSGi は宣言型サービスの動的モジュールシステムです。OSGi の各 jar はバンドルと呼ばれ、それぞれにクラスローダーが含まれています。各バンドルはエクスポートする (公開する) パッケージやインポートするパッケージ (外部の依存関係) を指定します。OSGi はこの情報を使用して、他のバンドルのクラスローダーをつなげます。主要な違いは、依存するバンドルを指定しない点 (または単一のモノリシッククラスパスを持つ点) です。代わりに、パッケージのインポートやバージョンを指定して、OSGi は利用可能なバンドルから依存関係などの情報を取得します。
コアの jBPM jar (およびコアの依存関係) はすべて OSGi に対応できるようになっています。(META-INF ディレクトリに) 依存関係を記述する MANIFEST.MF ファイルが含まれており、これらのマニフェストファイルは自動的にビルドにより生成され、jar を直接 OSGi 環境にプラグインすることができます。
以下の jBPM jar は OGSI に対応しています。
  • jbpm-flow
  • jbpm-flow-builder
  • jbpm-bpmn2
以下の例は、サービスレジストリを使用して OSGi 環境から必要なサービスをルックアップし、セッションを作成して、プロセスの開始やイベントのシグナル送信に使用できるようにしています。

例13.1 OSGi の例

ServiceReference serviceRef = bundleContext.getServiceReference( ServiceRegistry.class.getName() );
ServiceRegistry registry = (ServiceRegistry) bundleContext.getService( serviceRef );

KnowledgeBuilderFactoryService knowledgeBuilderFactoryService = registry.get( KnowledgeBuilderFactoryService.class );
KnowledgeBaseFactoryService knowledgeBaseFactoryService = registry.get( KnowledgeBaseFactoryService.class );
ResourceFactoryService resourceFactoryService = registry.get( ResourceFactoryService.class );

KnowledgeBuilderConfiguration kbConf = knowledgeBuilderFactoryService.newKnowledgeBuilderConfiguration( null, getClass().getClassLoader() );
KnowledgeBuilder kbuilder = knowledgeBuilderFactoryService.newKnowledgeBuilder( kbConf );
kbuilder.add( resourceFactoryService.newClassPathResource( "MyProcess.bpmn", Dummy.class ), ResourceType.BPMN2 );

KnowledgeBaseConfiguration kbaseConf = knowledgeBaseFactoryService.newKnowledgeBaseConfiguration( null, getClass().getClassLoader() );
KnowledgeBase kbase = knowledgeBaseFactoryService.newKnowledgeBase( kbaseConf );
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );

StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();