実世界に適用するために、activemq + camel を学習しようとしています。キューを消費し、メッセージを処理して別のキューに移動する必要があります。
私の懸念はパフォーマンスに関するものです。毎日少なくとも 100.000 件のメッセージを処理する必要があります。現時点では、垂直方向または水平方向のスケーリングには対応したくありません (テクノロジーが優れていると人々が確信するまで、これ以上の費用はかけられません)。
そこで、キューをポーリングし、メッセージを消費、処理、および他のキューに移動するいくつかのスレッドを開始することを考えました。スレッドの数は、増加する負荷レベルにハードウェアがどのように応答するかによって異なります。
私の最初の質問は次のとおりです。これは良いアプローチですか (並列スレッドを開始してキューを消費します)?
2 番目の質問は、Camel In Action を読むことから学習を始めたことです。何かが欠けているかどうかはわかりませんが、コンシューマーを構築する方法について少し混乱しています。FtpToJMSExample の書籍の例を適応させることで、以下のコードが得られました。実際には、スレッドごとに接続を作成することはありません。アプリケーション サーバー (glassfish) が提供する接続プールを使用します。
public class JMSToJMSExample {
public static void main(String args[]) throws Exception {
CamelContext context = new DefaultCamelContext();
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost");
context.addComponent("jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
context.addRoutes(new RouteBuilder() {
public void configure() {
from("jms:in")
.process(new CustomProcessor())
.to("jms:out");
} });
context.start();
Thread.sleep(10000);
context.stop();
}
}
それは正常に動作します。しかし、本はそれを「ポーリング」ソリューションと呼んでいます。while ループのようなものを期待していたので、キューにメッセージがある間は消費し続けます。わかりました、例はキューをポーリングしていますが、上記の例での私のポイントは、スリープ期間を短縮すると、可能なすべてのメッセージを処理せずに終了するということです。
とにかく、スレッドが起動するたびに接続プールに接続を要求するのではなく、長時間実行されるスレッドを確立する方が良いと思います。
私が学んでいるので、時間/期間でポーリングするのではなく、空になるまで jms キューをポーリングするスレッドを作成する方法の例を教えてください。
ティア、
ボブ