web-dev-qa-db-ja.com

Java Message Service(JMS))とは何ですか?

私は現在JMSを評価していますが、JMSを何に使用できるのかわかりません。

現在、これはユースケースであると考えています。SalesInvoicePDFを作成し、SalesOrderがウェアハウスを離れたときに印刷したいので、Deliveryトランザクション中に、トランザクション印刷要求を送信できます。 SalesOrderトランザクションが正常に完了すると開始されます。

現在、ほとんどのJMS製品がスタンドアロンサーバーであることがわかりました。

  • メッセージ処理にスタンドアロンサーバーが必要なのはなぜですか。 Quartzスケジューラを使用した簡単なインプロセス処理?
  • それは私のアプリケーションとどのように相互作用しますか?
  • 遅すぎませんか?
  • すでに成功裏に実装したユースケースは何ですか?
32
Daniel

JMSは驚くほど便利なシステムですが、すべての目的に対応しているわけではありません。

これは本質的に、ノード間でメッセージを送信するための高レベルのフレームワークであり、検出、堅牢性などのオプションがあります。

有用な使用例の1つは、クライアントとサーバーが互いに通信したいが、クライアントが実際にサーバーのアドレスを持たない場合です(たとえば、複数のサーバーがある場合があります)。クライアントはブローカーとキュー/トピック名を知るだけでよく、サーバーも接続できます。

JMSは堅牢性も追加します。たとえば、クライアントがメッセージを送信している間にサーバーが停止した場合やその逆の場合でも、クライアントからメッセージを送信したり、サーバーからメッセージをポーリングしたりできるように構成できます。これをソケットで直接実装しようとしたことがあれば、それは悪夢です。

あなたが説明するシナリオは古典的なJ2EE問題のように聞こえますが、なぜJ2EEフレームワークを使用しないのですか? JMSはJ2EE内部で通信によく使用されますが、他のすべての利点があります。

44
Uri

何がJava Message Service(JMS)for

JMSはメッセージング標準であり、Java EEアプリケーションがメッセージを緩やかに作成、送信、受信、消費することを可能にします結合された、信頼性の高い、非同期の方法詳細については、 Java Message Service APIの概要 を参照することをお勧めします。

メッセージ処理にスタンドアロンサーバーが必要なのはなぜですか。 Quartzスケジューラを使用した簡単なインプロセス処理?

確かに、あなたの場合、クォーツはオプションです。しかし、請求書システムがリモートシステムの場合はどうでしょうか。答えを待ちたくない場合はどうしますか?リモートシステムと通信するときにリモートシステムがダウンしている場合はどうなりますか?ネットワークが常に利用できない場合はどうなりますか?これがJMSの出番です。JMSを使用すると、配信が保証されたメッセージを送信し、トランザクション方式でメッセージを消費できます(メッセージの送信または消費は、グローバルトランザクションの一部である場合があります)。

アプリケーションとどのように相互作用しますか?

JMSは、ポイントツーポイントとパブリッシュ/サブスクライブの2つの通信モードをサポートします(これが質問に答える場合)。

遅すぎませんか?

私が一緒に取り組んできたMOMは非常に高速でした。

すでに成功裏に実装したユースケースは何ですか?

予約アプリケーション、バンキングバックオフィス(市場データの処理)などのシステムで使用されるか、または単に電子メールを送信するために使用されます。

こちらもご覧ください

17
Pascal Thivent

メッセージ処理にスタンドアロンサーバーが必要なのはなぜですか。 Quartzスケジューラを使用した簡単なインプロセス処理?

JMSの長所は、同じキューに複数のプロデューサーと複数のコンシューマーを設定でき、JMSブローカーが負荷を管理することです。

複数のプロデューサーがあるが単一のコンシューマーである場合、クオーツスケジューラーやデータベーステーブルなどの他のアプローチも使用できます。しかし、複数のコンシューマが作成されるとすぐに、ロックスキームは設計が非常に難しくなります。すでに承認されたメッセージングソリューションを使用する方がよいでしょう。いくつかの詳細については、これらの他の回答を参照してください: 非同期ソリューションにJMSを選択する理由 および データベースを使用するプロデューサー/コンシューマーシステム

その他の点は、曖昧すぎて答えられません。

5
ewernli

多くのプロジェクトで使用しました。スケーラビリティ、サービスの分離、高可用性に役立ちます。数年前のプロジェクトでの使用方法を次に示します。

http://coders-log.blogspot.com/2008/12/favorite-projects-series-installment-2.html

説明では、JMSがこの特定のプロジェクトのテーブルにもたらしたものについて説明しますが、他のプロジェクトはさまざまな理由でメッセージングシステムを使用します。

3
Don Branson

Javadoc から:

Javaメッセージサービス(JMS)APIは、Javaプログラムがエンタープライズメッセージングシステムのメッセージを作成、送信、受信、および読み取るための一般的な方法を提供します。

つまり、ここでの他のすべての回答とは異なり、JMSはAPI、にすぎませんベンダーによって実装された「JMSプロバイダー」を介して、サードパーティのメッセージブローカーへのアクセスをラップします。 IBM MQや他の数十などのMessage Brokersには、他の回答で言及されている信頼性、非同期性などの機能があります。 JMS自体はそれらをまったく提供しません。 SQLデータベースに対するJDBCの役割はMessage Brokersに対するものであり、(特に)JNDIはLDAPサーバーに対するものです。

1
user207421

JMSは メッセージ指向ミドルウェア です。

  • メッセージ処理にスタンドアロンサーバーが必要なのはなぜですか。 Quartzスケジューラを使用した簡単なインプロセス処理?

それはあなたが持つかもしれない他のコンポーネントに依存します。私は推測する。でも私はクォーツについて何も知りません

  • それは私のアプリケーションとどのように相互作用しますか?

ブローカーにメッセージを送信します。

  • 遅すぎませんか?

何と比較?

  • すでに成功裏に実装したユースケースは何ですか?

JMSを使用してSIPアプリケーションサーバーを実装し、さまざまなコンポーネント間で通信しました。

1
LB40

メッセージングは​​通常、さまざまなシステムを相互接続し、リクエスト/コマンドを非同期で送信するために使用されます。一般的な例は、トランザクションの承認を要求する銀行のクライアントアプリケーションです。サーバーは別の銀行のシステムにあります。両方のシステムはEnterprise Service Busで接続されています。要求はメッセージングバスに入り、即座にメッセージの受信を確認します。クライアントは処理を続行できます。サーバーシステムが使用可能になると、バスはメッセージをサーバーシステムに転送します。もちろん、サーバーがトランザクションを正常に実行したか失敗したかをクライアントに通知するには、2番目のパスが必要です。これもJMSで実装できます。

2つのシステムがJMSを実装する必要がないことに注意してください。 1つはJMSを使用でき、もう1つはMSMQを使用できます。バスが相互接続を処理します。

1
kgiannakakis

JMSの非常に良い説明と例を見つけました。

これは、JMSキューを使用した単純なチャットアプリケーションであり、ユーザー間でメッセージをやり取りするために使用されます。受信者がオフラインの場合、メッセージはキューに残ります。

この実装例では、彼らは

  • ドメインクラスを生成するXSD。
  • IDEとしてのEclipse EE。
  • Web /アプリケーションサーバーとしてのJBoss。
  • UIのHTML/JavaScript/JQuery。
  • コントローラとしてのサーブレット。
  • MySQLをDBとして。

キューのJBoss設定手順はうまく説明されています http://coder2design.com/messaging-service/ で利用できます

ダウンロード可能なコードも利用できます。

0
Jatinder Pal