2016-05-10 4 views
2

私はかなりJavaを使い慣れていませんし、現在多くのDropwizardベースのマイクロサービスとJava8 SEを使用してWebアプリケーションを作成しています。サービス間で非同期通信用のMessage Queueを統合し、Amazon SQSのようなクラウドベースのキューを使用して開始したいと考えています。しかし、私は自分自身を特定のクラウドプロバイダーに入れたくないので、別のプロバイダーに簡単に切り替えるか、後でRabbitMQやActiveMQのようなものを使うのが好きです。だから私の質問は、これを可能にするJavaのフレームワークはありますか?たとえば、Hibernateでは単純なコンフィグレーションの変更でデータベースを切り替えることができます。メッセージキューには同等の機能がありますか?Java Message Queue抽象化

私はこれを研究するのにかなりの時間を費やしましたが、これまでどこでも決定的な回答を見つけることができませんでした。少し私が後だもののように見えますが、唯一のJava EE版で利用できるようにすると、必要とアプリサーバも見えます

  • JMS、?あれは正しいですか?
  • AMQPメッセージキューの相互運用性のための低レベルプロトコルのように見えます。純粋なAMQPメッセージライブラリのように見えるApache Qpid Protonもありますが、JavaのすべてのドキュメンテーションとサンプルはJMSを使用しているようです。
  • 特定のMQ(Rabbitなど)で見つけられるすべてのチュートリアルでは、キュー固有のクライアントライブラリを使用しています。
  • 明らかに私自身の抽象化レイヤーを追加することはできますが、ホイールを再作成したくないので、私はこのようなことをしたい最初の開発者ではないと思います。

答えて

1

JMS APIを使用すると、異なるデータベースプロバイダ間で切り替えることができるのと同じように、HibernateまたはJDBCだけで、特定のベンダー拡張を使用していないという条件で、メッセージブローカまたはメッセージプロバイダを自由に切り替えることができます。あなたのコード。

JMSは単なるAPIであり、さまざまなベンダーが実装し、メッセージングプロバイダで使用するクライアントを提供するAPIのみがJMSプロトコルではありません。あなたのJava 8コードのJMS APIをうまく使うことができます。その時に使用していたベンダーのクライアントjarとともに選択したビルド管理ツールを使用して、JMS API jarをプルするだけです。 Apacheのライセンスを取得したバージョンのJMS API jarを取得する方法については、questionの回答を参照してください。

AmazonがJMS実装を提供していることから、hereというドキュメントはうまくカバーしているようです。

ActiveMQやRabbitMQなどの別のメッセージング製品に切り替える場合は、クライアントがスワップアウトできる既存のコードを変更する必要のないJMS実装があります任意のベンダー拡張を使用)。 AMQP 1.0サポートを提供するメッセージングソリューションに切り替えると、Apache Qpidプロジェクトhereが提供するAMQP 1.0実装よりもJMSが実装されます。

JMSの仕様といくつかのチュートリアルを読んで、JMSとJNDIをどのように活用して、プロバイダにとらわれないコードを作成できるようにする必要があると思います。

1

Javaワールド内のJMSは、キューを介してメッセージを生成/受信するための最も一般的なAPIの1つです。 JMSを使用する場合は、任意のJMSプロバイダ(activeMQ、rabbitMQ ...)を自由に使用できます。また、プロバイダ(JMS APIのみを呼び出す)に直接コールを行わないと、簡単に切り替えることができます。

メッセージがプロデューサーから消費者に移動するためには、ブローカー(それらを処理するソフトウェア)が必要です。ブローカーは、専用サーバーでホストすることも、アプリケーションに組み込むこともできます(2番目のオプションはお勧めしません)。

AMQPは、より新しいプロトコルであり、ワイヤレベルです。一部のブローカーはAMQPとJMSの両方を処理できます。

AMQPとJMSの両方で適切な抽象化を提供できます。しかし両者には限界があります。一方では、JMSを使用していくつかのフィーチャー/ファイン・コンフィギュレーション・チューニングを使用するように誘惑される可能性があり、特定の動作のために実装依存になる可能性があります。一方、あなたが選んだAMQPのバージョン(0.9または1.0+)を指定したAMPQでは、いくつかのブローカーしか選択できない場合があります。そのバージョンが大きく異なり、ほとんどのブローカーがそのうちの1つしかサポートしていないためです。

+0

ありがとう、JMSはJava EEでのみ利用できますか? Java SEで使用する場所はありませんか?私の問題は、Java EEはJava 7でのみ利用可能であり、私は既にJava 8の多くの機能を自分のコードで使用していたので、Java 7への切り替えには多くのリファクタリングが必要です! –

+0

もちろん、Java SEで使用することもできます。プロジェクトパスにjavax.jmsなどの必要なjarファイルをインクルードするだけです。あなたはそれを直接行うことも、mavenのようなツールを使って行うこともできます。 – Vaaith

0

JMS 2.0を探している場合はプロバイダーを慎重にチェックします。一部の場合、つまりActiveMQはJMS 1.1のみをサポートします。