JMSとActiveMQを使用したSpring Remoting
1概要
/spring-remoting-amqp[前の記事]非同期チャネルの上に
RPC
を
AMQP
キューとして提供するために
Spring Remoting
を使用する方法を説明しました。ただし、
JMS
を使用しても同じ結果が得られます。
この記事では、実際には、メッセージングミドルウェアとして
Spring Remoting JMS
と
Apache ActiveMQ
を使用してリモート呼び出しを設定する方法を探ります。
2 Apache ActiveMQブローカーの起動
Apache
ActiveMQ
は、アプリケーションが非同期的に情報を交換できるようにする
オープンソースのメッセージブローカー
であり、
Java Message Service
API
と完全に互換性があります。
私たちの実験を実行するには、まず
ActiveMQ
の実行中のインスタンスを設定する必要があります。
非公式ガイド
に記載されている手順に従うか、それを
Java
アプリケーションに埋め込むか、より簡単に
Docker
コンテナを次のようにスピンアップします。コマンド:
docker run -p 61616:61616 -p 8161:8161 rmohr/activemq:5.14.3
これにより
ActiveMQ
コンテナが起動し、ポート8081に簡単な管理Web GUIが表示されます。これを通じて、利用可能なキュー、接続されているクライアント、その他の管理情報を確認できます。
JMS
クライアントは、ブローカーに接続してメッセージを交換するために、ポート61616を使用する必要があります。
3 Mavenの依存関係
Spring Remoting
をカバーする以前の記事のように、
JMS Remoting
がどのように機能するかを示すためにサーバーとクライアント
Spring Boot
アプリケーションをセットアップします。
いつものように
Spring Boot
スターターの依存関係を慎重に選択します。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
Tomcat
関連の
.jar
ファイルがクラスパスに含まれないように、
spring-boot-starter-tomcat
を明示的に除外しました。
これにより、アプリケーションの起動時に__Spring Bootの自動設定メカニズムによって組み込みWebサーバーが起動されるのを防ぐことができなくなります。
4サーバーアプリケーション
4.1. サービスを公開する
クライアントが起動できる
CabBookingService
を公開するサーバーアプリケーションを設定します。
-
最初のステップは、クライアントに公開するサービスのインターフェースを実装するBeanを宣言することです** これは、サーバー上でビジネスロジックを実行するBeanです。
@Bean
CabBookingService bookingService() {
return new CabBookingServiceImpl();
}
次に、コンストラクタで名前を指定して、サーバーが呼び出しを取得するキューを定義しましょう。
@Bean
Queue queue() {
return new ActiveMQQueue("remotingQueue");
}
以前の記事からすでに知っているように、
Spring Remoting
の主な概念の1つは
Service Exporter
、あるソースからの呼び出し要求を収集するコンポーネント** 、この場合は
ApacheMQ
キュー──で目的のメソッドを呼び出します。サービスの実装
JMS
を操作するために、
JmsInvokerServiceExporter
を定義します。
@Bean
JmsInvokerServiceExporter exporter(CabBookingService implementation) {
JmsInvokerServiceExporter exporter = new JmsInvokerServiceExporter();
exporter.setServiceInterface(CabBookingService.class);
exporter.setService(implementation);
return exporter;
}
最後に、メッセージを消費する責任を持つリスナーを定義する必要があります。
リスナーは
ApacheMQ
と
__
JmsInvokerServiceExporter
の間のブリッジとして機能し、キューで使用可能な呼び出しメッセージをlistenし、呼び出しをサービスエクスポーターに転送して結果をシリアル化します。
@Bean SimpleMessageListenerContainer listener(
ConnectionFactory factory,
JmsInvokerServiceExporter exporter) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(factory);
container.setDestinationName("remotingQueue");
container.setConcurrentConsumers(1);
container.setMessageListener(exporter);
return container;
}
4.2. 構成
Application.properties
ファイルを設定して、
Spring Boot
がいくつかの基本的なオブジェクトを設定できるようにすることを忘れないでください。さまざまなパラメータの値は主に方法によって異なります
さまざまなパラメータの値は、主に
ApacheMQ
のインストール方法によって異なります。次の例は、これらの例を実行するのと同じマシン上で実行される
Docker
コンテナの妥当な構成です。
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.packages.trusted=org.springframework.remoting.support,java.lang,com.baeldung.api
spring.activemq.broker-url
パラメーターは、
AMQ
ポートへの参照です。代わりに
spring.activemq.packages.trusted parameter
についてより深い説明が必要です。バージョン5.12.2以降のActiveMQでは、デフォルトですべてのタイプのメッセージが拒否されます。
-
バージョン5.12.2以降、ActiveMQは
ObjectMessage
型のメッセージをデフォルトで拒否します。これは、状況によってはセキュリティ攻撃を受ける可能性があると考えられるため、シリアル化された
Java
オブジェクトの交換に使用されます。
とにかく、指定されたパッケージ内の直列化されたオブジェクトを受け入れるように
AMQ
に指示することは可能です。
org.springframework.remoting.support
は、リモートメソッドの呼び出しとその結果を表すメインメッセージを含むパッケージです。その包み
パッケージ
com.baeldung.api
には、パラメータと当社のサービスの結果が含まれています。キャブ予約の結果を表すオブジェクトが
String
を参照しているため、
java.lang
が追加されています。したがって、これもシリアル化する必要があります。
5クライアントアプリケーション
5.1. リモートサービスを起動する
今クライアントに取り組みましょう。繰り返しになりますが、呼び出しメッセージが書き込まれるキューを定義する必要があります。クライアントとサーバーの両方が同じ名前を使用していることを再確認する必要があります。
@Bean
Queue queue() {
return new ActiveMQQueue("remotingQueue");
}
その後、エクスポーターを設定する必要があります。
@Bean
FactoryBean invoker(ConnectionFactory factory, Queue queue) {
JmsInvokerProxyFactoryBean factoryBean = new JmsInvokerProxyFactoryBean();
factoryBean.setConnectionFactory(factory);
factoryBean.setServiceInterface(CabBookingService.class);
factoryBean.setQueue(queue);
return factoryBean;
}
これで、リモートサービスをローカルBeanとして宣言されているかのように使用できます。
CabBookingService service = context.getBean(CabBookingService.class);
out.println(service.bookRide("13 Seagate Blvd, Key Largo, FL 33037"));
5.2. 例を実行する
また、クライアントアプリケーションの場合は、アプリケーション内の値を正しく選択する必要があります
__。properties
__ファイル。一般的な設定では、これらはサーバー側で使用されているものと完全に一致します。
これは
Apache AMQ
を介したリモート呼び出しを示すのに十分なはずです。それでは、まず
ApacheMQ
を起動し、次にサーバーアプリケーションを起動し、最後にリモートサービスを呼び出すクライアントアプリケーションを起動しましょう。
6. 結論
このクイックチュートリアルでは、
JMS
システムの上に
RQ
を
AMQ
として提供するために
Spring Remoting
を使用する方法を説明しました。
Spring Remotingは、基盤となるチャネルに関係なく、非同期呼び出しをすばやく設定する方法を簡単に実証します。
いつものように、あなたはソースhttps://github.com/eugenp/tutorials/tree/master/spring-remoting/remoting-jms[GitHubについて]を見つけるでしょう。