SWT を使用した jBPM スタンドアロン アプリ
質問
jBPM ページ [1] のホワイトペーパーによると、jBMP はスタンドアロン アプリで簡単に使用できます。ただし、実際にこれを行う方法に関する情報は見つかりませんでした。jBPM でプロセスを表示する、単純な Java アプリ (おそらく SWT を使用) を作成したいと考えています。ユーザーは、jBPM ダイアグラムを変更することで、アプリケーションの動作を変更できるようになります。この目的のために、いくつかの Eclipse コンポーネントも統合する必要があると思います。これがどのように機能するのか何かアイデアはありますか?
解決
始める前に、次のことも確認してください。 ロームフロー スタンドアロンの jBPM Eclipse/RCP ベースのビューア/エディタであるため、ニーズを満たしています。
それ以外の場合は、Eclipse プラグインの構築方法を知るか、ほとんどの Eclipse プラグイン/SWT 開発ニーズに役立つ書籍、Eclipse と Addison-Wesley が発行する『Eclipse Building Commercial-Quality Plug-ins』を入手する必要があります。また、私は座ってテスト アプリを書くつもりはありません。とにかく基本を理解する必要があります。
スタンドアロンとは、適切なライブラリを備えた古い JVM で実行することを意味します。J2EE コンテナにデプロイしたり、Web 経由で表示したりする必要があります。
jBPM Eclipse プラグインのソース コードを見てください。探している機能が含まれています。これに基づいた SWT/Eclipse は jBPM を表示します。これには、Eclipse プラグインを迅速に構築するために使用できる、jBPM がインストールする可能性のある拡張ポイントのチェックが含まれます。例えば:jBPM エディターのコード、 ここ. 。あるいはシリアル化の方法、 ここ, 、 再利用。
ここに重要な SWT/描画があり、重要な行は jBPM を SWT のもの「g = new SWTGraphics(gc);」に変換することです。これはjBPMモデルから画像を生成するようです。
protected void writeImage() { SWTGraphics g = null; GC gc = null; Image image = null; LayerManager lm = (LayerManager)getGraphicalViewer().getEditPartRegistry().get(LayerManager.ID); IFigure figure = lm.getLayer(LayerConstants.PRINTABLE_LAYERS); try { Rectangle r = figure.getBounds(); image = new Image(Display.getDefault(), r.width, r.height); gc = new GC(image); g = new SWTGraphics(gc); g.translate(r.x * -1, r.y * -1); figure.paint(g); ImageLoader imageLoader = new ImageLoader(); imageLoader.data = new ImageData[] {image.getImageData()}; imageLoader.save(getImageSavePath(), SWT.IMAGE_JPEG); refreshProcessFolder(); } finally { //SNIP } }
プラグインの plugin.xml、src から学習します。 ここ この場合。たとえば、ビューを Eclipse に追加する jBPM は次のとおりです。
point="org.eclipse.ui.views" ... view class="org.jboss.tools.flow.jpdl4.view.DetailsView"...
これ 「ビュー」を立ち上げるように見えるので、コピーしたい拡張子の1つかもしれません。これは、Eclipse ベースのアプリの部分をどのように構築するかを理解するのに役立ちます。JBPM プラグインに開発者バージョンをインストールしている場合は、ワークスペースでこれらのクラスを検索し、ソース コードを表示できます。
モデル、ビュー/図の動作、さまざまな編集/描画部分など、GMF (グラフィカル モデリング フレームワーク) として構築されたアプリの部分をハックする必要があるかどうかを決定します。あなたもそうでない限り、これをいじらないでください。ただし、GMF プラグインを理解するかサンプルを見ると、特に編集が必要な場合に、どの jBPM プラグイン部分を使用する必要があるかを理解するのに役立ちます。
jBPM プロジェクトから可能な部分 (プラグイン/プラグレット) を再利用できることを忘れずに、要素をプラグインにまとめます。Eclipse プラグインを RCP またはリッチ クライアントとしてビルドすることを忘れないでください...(jBPM には現在 RCP がないことに注意してください。 役職) これにより、Eclipse スタンドアロン アプリケーションとして機能し、Eclipse ツールの知識がない人でも簡単に導入できるようになります。
これで正しい道に進むことができるかどうか教えてください。
他のヒント
はい、jbpm プロセス エンジンを完全にスタンドアロンで、単純な Java プログラムとして実行することができます。J2EE コンテナは必要ありません。少なくとも jbpm 4.4 ではこれが当てはまります。
コード要件に関する限り、
- jbpmデータベーススキーマをセットアップする
- 次の jar を jbpm 配布ライブラリからアプリケーションのクラスパスに追加します。antlr-runtime.jar antlr.jar dom4j.jar hibernate-core.jar javassist.jar jbpm.jar slf4j-api.jar slf4j-jdk14.jar slf4j-log4j12.jar commons-collections.jar Juel-Engine.jar Juel-impl.jar Mail.jarと、使用しているDBに必要なJDBCドライバー。
- スタンドアロン クラスは次のようになります。
package test.ayusman;
import java.util.HashMap;
import java.util.Map;
import org.jbpm.api.Configuration;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
public class ProcessDeployer {
// Create a process engine that can be used for all other work...
// ProcessEngine is starting point for all other application.
private static ProcessEngine jbpmProcessEngine = new Configuration()
.setResource("jbpm.cfg.xml").buildProcessEngine();
// private static Logger logger = Logger.getLogger(JBPMDao.class);
private static RepositoryService repositoryService = null;
private static ExecutionService executionService = null;
private static ProcessInstance pi = null;
private static String processInstanceState;
private static String processInstanceId;
public static void main(String[] args) {
try {
ProcessDeployer ejm = new ProcessDeployer();
//Start the process...
ejm.startProcess();
//Analyze process... just a small fancy method
ejm.analyzeProcess();
} catch (Exception e) {
e.printStackTrace();
}
}// End of main()
void startProcess() throws Exception
{
repositoryService = jbpmProcessEngine.getRepositoryService();
executionService = jbpmProcessEngine.getExecutionService();
//NOTE: The example assumes that the process definition file name is: your_process.jpdl.xml
processInstanceId = repositoryService.createDeployment().addResourceFromClasspath("your_process.jpdl.xml").deploy();
//NOTE: The jpdl file has key name as "Java"
pi = executionService.startProcessInstanceByKey("Java");
System.out.println("Obtained processInstanceId is: "+processInstanceId);
}
void analyzeProcess() throws Exception
{
processInstanceState = pi.getState();
System.out.println("processInstanceState is: "+processInstanceState);
System.out.println("processInstanceId is: "+processInstanceId);
}
}// End of class ProcessDeployer
- SWT アプリケーションでプロセス エンジンを実行している場合、プロセス エンジンは SWT と同じ JVM 上に常駐するため、十分なスペースを割り当てていることを確認してください。
お役に立てれば :-)