5

まず始めに、私は Camel を初めて使用し、ごく最近になってその主な概念を把握したことをお知らせしたいと思います。

ActiveMQ をブローカーとして Apache-Camel を使用し、フェイルオーバー構造を使用してロードバランサーのクライアントとして jms-component を使用して、基本的な動作例を作成しようとしています。これはすべて、Java DSL のみを使用して行われます (可能な場合)。

この例は、MyApp-A、MyApp-B、MyApp-C、および MyApp-D と呼ばれる 4 つのメイン アプリで構成されています。通常のシナリオでは、MyApp-A は自分のコンピューターからファイルを読み取り、それをメッセージに変換します。次に、そのメッセージを MyApp-B に送信し、MyApp-B はそれを MyApp-C に送信します。

ここに画像の説明を入力

ただし、失敗のシナリオがあります。このシナリオでは、MyApp-A は MyApp-B にメッセージを送信できません。次に、メッセージを MyApp-D に送信し、次に MyApp-C に送信します。

ここに画像の説明を入力

ベローは MyApp-A の私のコードです

public class MyApp-A {

    public static void main(String args[]) throws Exception {
        // create CamelContext
        CamelContext context = new DefaultCamelContext();

        // connect to embedded ActiveMQ JMS broker
        ConnectionFactory connectionFactory = 
            new ActiveMQConnectionFactory("vm://localhost");
        context.addComponent("jms",
            JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));

        // add our route to the CamelContext
        context.addRoutes(new RouteBuilder() {
            @Override
            public void configure() {
                from("file:data/inbox?noop=true")loadbalancer().failover().to("MyApp-B:incomingOrders").to("MyApp-D:incomingOrders").end();
            }
        });

        // start the route and let it do its work
        context.start();
        Thread.sleep(10000);

        // stop the CamelContext
        context.stop();
    }
}

camel-ftpの使用を検討しましたが、MyApp-C は MyApp-B が停止したことを認識せず、MyApp-D から取得する必要があることを認識しないため、機能しません。

今、いくつかの問題と質問があります。

  1. MyApp-A から別のアプリケーションである MyApp-B にメッセージ (この場合はファイル) を送信するにはどうすればよいですか? .to(String)Java DSLのメソッドには実際に何を入れればよいのでしょうか?
  2. MyApp-B を実際にコーディングするにはどうすればよいですか? A (おそらく別のマシンの別のアプリケーション) からメッセージを受信し、それを MyApp-C に送信するにはどうすればよいですか (MyApp-A から MyApp-B に送信する方法がわかれば、 MyApp-B から MyApp-C に送信する方法がわかりますか?
  3. MyApp-A は、MyApp-B が失敗したことをどのように検出しますか?
  4. どのキャメルコンポーネントを使用する必要がありますか?

私のコードと問題の修正方法についてフィードバックを提供していただければ、さらに感謝いたします。

4

1 に答える 1

3

多くの努力の結果、Apache が提供するロードバランサーの例に基づいて、これを実装する方法を見つけました。

Eclipse プロジェクトを github アカウントにアップロードしました。ここで動作を確認できます。

私の例は全体的な意図したアーキテクチャを尊重していますが、以下に説明するようにいくつかの違いがあります。

  • Java DSL の代わりに Spring DSL を使用します。
  • MyApp-A はロードバランサーです。10 回ごとに (ファイルを読み取る代わりに) レポートを生成し、それを MyApp-B に送信します。
  • MyApp-B は、localhost:9991 の MINA サーバー 1 に対応します。
  • MyApp-C は、localhost:9993 の MINA サーバー 3 に対応します。
  • MyApp-D は、localhost:9992 の MINA サーバー 2 に対応します。
  • MyApp-C がレポートを受信すると、それを MyApp-A に送り返します。

さらに、いつ、どこで、なぜ MyApp-C が変更されたレポートで MyApp-A に応答するかも明らかではありません。この動作は Spring DSL コードでは指定されておらず、これまでのところ、なぜこれが起こっているのかを説明することはできませんでした。

したがって、2 つの問題が残ります。

  1. Java DSL を使用してこれを行う方法
  2. MyApp-C が MyApp-A に応答するのはなぜですか? また、どのように応答していますか?

興味のある方のために、私が作成した README.txt と問題の正確な説明を以下に示します。

MINA を使用したロード バランシングの例

この例では、Camel-MINA コンポーネントを使用して、サーバーがダウンしたときに要求をリダイレクトするフォールト トレラント ソリューションを可能にするソリューションを簡単に設計する方法を示します。これらのサーバーは、Apache MINA フレームワークによって作成され、個別の JVM で実行されるシンプルな TCP/IP サーバーです。

この例では、ロード バランサ クライアントは 10 秒ごとにレポートを生成し、そのレポートを localhost:9991 で実行されている MINA サーバーに送信します。次に、このサーバーはレポートを localhost:9993 で実行されている MINA サーバーに転送します。MINA サーバーはレポートをクライアントに返し、コンソールに出力できるようにします。各 MINA サーバーはメッセージの本文を変更するため、レポートが使用する必要があったルートを確認できます。何らかの理由 (CTRL+C を押したとします) で、localhost:9991 で実行されている MINA サーバーが停止している場合、ロードバランサーは、localhost:9992 で実行されている MINA サーバーを使用して自動的に開始します。この MINA サーバーがレポートを受信すると、何事もなかったかのように、localhost:9993 で実行されている MINA サーバーに送信します。localhost:9991 が再び立ち上がると、

ロード バランサーは、何があっても localhost:9992 を使用する前に、常に localhost:9991 を使用しようとします。

例の実行

プロジェクトをコンパイルして Maven リポジトリにインストールするには、プロジェクトのルートで次のコマンドを実行します。

mvn クリーン インストール

この例を実行するには、それぞれのフォルダーで次のコマンドを実行します。

mina1:
mvn exec:java -Pmina1

mina2: mvn exec:java -Pmina2

mina3: mvn exec:java -Pmina3

負荷分散: mvn exec:java -Ploadbalancer

問題が発生した場合は、Camel Forums http://camel.apache.org/discussion-forums.htmlでお知らせください。


ペドロ・マルティンス!


編集

前回の投稿で 2 つの質問がありました: 1. Java DSL でこれを行う方法 2. なぜ mina サーバーが応答を送信するのか

最終的には問題 1 に取り組みますが、問題 2 の解決策がここにあることを述べたいと思います: http://camel.465427.n5.nabble.com/Load-balancing-using-Mina-example-with-Java- DSL-td5742566.html#a5742585

答えと提案をしてくれたクラウス氏に感謝します。


編集

両方の問題が解決され、両方とも同じ git リポジトリにあります。私のコードが人々の役に立てば幸いです。

于 2013-11-05T12:17:50.353 に答える