4

まず、スタックオーバーフローに私のような質問が既にある場合は、申し訳ありませんが、見つけることができませんでした。実際、必要なソリューションを検索するためにどのタグを使用できるかわかりません。

基本的に、プロセス全体で複数のツール/アクションを使用してデータ (オブジェクト) フローを管理できるツール/ソフトウェアが必要です。もちろん、既存の BPM/ワークフロー プラットフォーム ツールの 1 つはおそらくそれを行うことができますが、私の要件には複雑すぎるようです。

JPA/Hibernate で構築された「静的」データ モデルがあります。次に、別の処理関数を使用するために、その静的モデルを変更する必要があります。その関数は、一部の Java クラス、Web サービス、または外部アプリケーション (バッチ モードをサポートする) である可能性があります。その後、これらの関数からの出力をキャッチし、いくつかの視覚化を行い、いくつかのチャートを描画する必要があります。これらの処理関数はすべて静的モデルにアクセスでき、その特定のモデルに変更できるため、変更する必要はありません。それらに入力を渡します。一方、それらの出力は、メインの「ワークフローマネージャー」によってキャッチされる必要があります。

もう1つ、プロセス全体がユーザーの操作なしで自動的に実行される必要があります(将来変更される可能性がありますが、今のところ見て、提示してください)。プロセスを開始する前に、管理者はどの「処理機能」を使用するかを定義する必要があります。もう1つ...データベースの状態が変更されたときにプロセス全体がトリガーされた場合が最善ですが、それは重要ではありません。たとえば、Webサービスを呼び出して開始できます。

問題は、jBPM や Activiti などの既存の BPM/ワークフロー ツールのいずれかを使用するか、単純な「ワークフロー マネージャー」を独自に作成するか、jBPM/Activiti よりもはるかに単純な既存のツールを使用するか (何かありますか?) です。 . もちろん、私は最も簡単なアプローチを好みます...

フィードバックをお寄せいただきありがとうございます。

4

1 に答える 1

9

Apache Camel は、これに役立つオープン ソースの統合フレームワークです。

Apache Camelを使用して、各プロセスがProcessorを実装する独自の単純なワークフロー マネージャーを構築できます。camel Exchangeを使用して、データをプロセッサ経由で渡すことができます。詳細については、ラクダの例をご覧ください。

カスタム プロセッサの記述方法については、こちらをお読みください

プロセッサを Camel RouteBuilder に動的に追加したり、Quartz Schedulerなどを使用してスケジュールを設定したりできます。これにより、多かれ少なかれすべての要件に対処できます。

Camel の紹介はこちら: http://www.kai-waehner.de/blog/2012/05/04/apache-camel-tutorial-introduction/

Camel を使用したワークフロー マネージャーの簡単な実装:

WorkflowManager.java

import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;

public class WorkflowManager {

    DefaultCamelContext camelContext;

    public WorkflowManager() {
        camelContext = new DefaultCamelContext();
        RouteBuilder routeBuilder = new RouteBuilder() {

            @Override
            public void configure() throws Exception {
                from("timer:schedule?period=1s&daemon=true").process(new ProcessOne()).process(new ProcessTwo());
            }
        };
        try {
            camelContext.addRoutes(routeBuilder);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void start() throws Exception {
        camelContext.start();
    }

    public void stop() throws Exception {
        camelContext.stop();
    }

    public static void main(String[] args) {
        WorkflowManager workflowManager = new WorkflowManager();
        try {
            workflowManager.start();
            while(true) {

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ProcessOne.java

import org.apache.camel.Exchange;
import org.apache.camel.Processor;

public class ProcessOne implements Processor {
    @Override
    public void process(Exchange exchange) throws Exception {
        System.out.println("In ProcessOne");
    }
}

ProcessTwo.java

import org.apache.camel.Exchange;
import org.apache.camel.Processor;

public class ProcessTwo implements Processor {
    @Override
    public void process(Exchange exchange) throws Exception {
        System.out.println("In ProcessTwo");
    }
}

このコードをコンパイルするには、Camel バージョン 2.9.0 を使用しました。メインスレッドを維持するために、メインメソッドで無限ループを使用したことに注意してください。

このコードは、ProcessOne と ProcessTwo を含むルートを 1 秒間実行します。プロセッサをルート ビルダーに追加する from(...) メソッドの期間を確認できます。したがって、このルートは繰り返し実行されます。また、データを流そうとしていません。各プロセッサの process メソッドで exchange を使用してデータを流すことができます。

出力は次のようになります。

In ProcessOne

In ProcessTwo

In ProcessOne

In ProcessTwo

Camel コンポーネントを使用して、WorkflowManager を堅牢にすることができます。

于 2012-08-07T09:40:08.023 に答える