先にジャンプ
VMware は、あなたの進歩を加速させるトレーニングと認定を提供します。
さらに学習したい方に (英語)Spring プログラミングモデルを拡張して、よく知られているエンタープライズ統合パターン (英語) をサポートします。Spring Integration は、Spring ベースのアプリケーション内で軽量メッセージングを可能にし、宣言型アダプターを介した外部システムとの統合をサポートします。これらのアダプターは、Spring のリモート処理、メッセージング、スケジューリングのサポートよりも高度な抽象化を提供します。Spring Integration の主なゴールは、保守可能なテスト可能なコードを作成するために不可欠な関心事の分離を維持しながら、エンタープライズ統合ソリューションを構築するためのシンプルなモデルを提供することです。
Spring Framework を使用すると、開発者はインターフェースを使用してコーディングし、依存性注入 (DI) を使用して、タスクの実行に必要な依存関係を Plain Old Java Object (POJO) に提供することが推奨されます。Spring Integration はこの概念をさらに一歩進めたもので、POJO はメッセージングパラダイムを使用して相互に接続され、個々のコンポーネントはアプリケーション内の他のコンポーネントを認識しなくなります。このようなアプリケーションは、きめ細かい再利用可能なコンポーネントを組み立てて、より高いレベルの機能を形成することによって構築されます。慎重に設計すれば、これらのフローをモジュール化して、さらに高いレベルで再利用することもできます。
Spring Integration は、きめの細かいコンポーネントを接続することに加えて、外部システムと通信するための幅広いチャネルアダプターとゲートウェイを提供します。チャネルアダプターは、一方向の統合(送信または受信)に使用されます。ゲートウェイは、リクエスト / 応答シナリオ(受信または送信)に使用されます。アダプターとゲートウェイの完全なリストについては、リファレンスドキュメントを参照してください。
Spring Cloud Stream プロジェクトは Spring Integration 上に構築され、Spring Integration はメッセージ駆動型マイクロサービスのエンジンとして使用されます。
エンタープライズ統合パターンのほとんどの実装
エンドポイント
チャンネル (ポイントツーポイントおよびパブリッシュ / サブスクライブ)
アグリゲーター
フィルター
Transformer
制御バス
…
外部システムとの統合
ReST/HTTP
FTP/SFTP
STOMP
Web サービス (SOAP と RESTful)
TCP/UDP
JMS
RabbitMQ
メール
…
広範な JMX サポートを備えたフレームワーク
フレームワークコンポーネントを MBean として公開
MBean から属性を取得し、操作を呼び出し、通知を送信 / 受信するアダプター
次の「クイックスタート」アプリケーションでは、同じゲートウェイインターフェースが 2 つの完全に異なるサービス実装を呼び出すために使用されていることがわかります。構築し、上記のように、spring-integration-ws と spring-integration-xml モジュールが必要になります。このプログラムを実行します。
public class Main {
public static void main(String... args) throws Exception {
ApplicationContext ctx =
new ClassPathXmlApplicationContext("context.xml");
// Simple Service
TempConverter converter =
ctx.getBean("simpleGateway", TempConverter.class);
System.out.println(converter.fahrenheitToCelcius(68.0f));
// Web Service
converter = ctx.getBean("wsGateway", TempConverter.class);
System.out.println(converter.fahrenheitToCelcius(68.0f));
}
}
public interface TempConverter {
float fahrenheitToCelcius(float fahren);
}
<!-- Simple Service -->
<int:gateway id="simpleGateway"
service-interface="foo.TempConverter"
default-request-channel="simpleExpression" />
<int:service-activator id="expressionConverter"
input-channel="simpleExpression"
expression="(payload - 32) / 9 * 5"/>
<!-- Web Service -->
<int:gateway id="wsGateway" service-interface="foo.TempConverter"
default-request-channel="viaWebService" />
<int:chain id="wsChain" input-channel="viaWebService">
<int:transformer
expression="'<FahrenheitToCelsius xmlns="https://www.w3schools.com/xml/"><Fahrenheit>XXX</Fahrenheit></FahrenheitToCelsius>'.replace('XXX', payload.toString())" />
<int-ws:header-enricher>
<int-ws:soap-action value="https://www.w3schools.com/xml/FahrenheitToCelsius"/>
</int-ws:header-enricher>
<int-ws:outbound-gateway
uri="https://www.w3schools.com/xml/tempconvert.asmx"/>
<int-xml:xpath-transformer
xpath-expression="/*[local-name()='FahrenheitToCelsiusResponse']/*[local-name()='FahrenheitToCelsiusResult']"/>
</int:chain>
そして、これが Java DSL(および Spring Boot)を使用した同じアプリケーション(Web サービス部分)です。Spring Boot を使用しない場合は、spring-boot-starter-integration 依存関係または spring-integration-core が直接必要になります。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args);
TempConverter converter = ctx.getBean(TempConverter.class);
System.out.println(converter.fahrenheitToCelcius(68.0f));
ctx.close();
}
@MessagingGateway
public interface TempConverter {
@Gateway(requestChannel = "convert.input")
float fahrenheitToCelcius(float fahren);
}
@Bean
public IntegrationFlow convert() {
return f -> f
.transform(payload ->
"<FahrenheitToCelsius xmlns=\"https://www.w3schools.com/xml/\">"
+ "<Fahrenheit>" + payload + "</Fahrenheit>"
+ "</FahrenheitToCelsius>")
.enrichHeaders(h -> h
.header(WebServiceHeaders.SOAP_ACTION,
"https://www.w3schools.com/xml/FahrenheitToCelsius"))
.handle(new SimpleWebServiceOutboundGateway(
"https://www.w3schools.com/xml/tempconvert.asmx"))
.transform(Transformers.xpath("/*[local-name()=\"FahrenheitToCelsiusResponse\"]"
+ "/*[local-name()=\"FahrenheitToCelsiusResult\"]"));
}
}
Spring Integration の Spring Boot 自動構成
また、Spring 機能カタログ [GitHub] (英語) も参照してください。ここでは、ほとんどのアーティファクトが基本的に特定の Spring Integration チャネルアダプターの自動構成です。
Spring Initializr でプロジェクトのひな形を生成します。