狠狠撸
Submit Search
Spring integration概要
?
15 likes
?
7,040 views
K
kuroiwa
Follow
2013-12-26 勉強会資料
Read less
Read more
1 of 39
Download now
Downloaded 49 times
More Related Content
Spring integration概要
1.
Spring Integration 概要 ! @Kuro
2.
本日のアジェンダ 1. Spring Integrationとは 2.
Spring Integrationの基本構成要素 3. サンプル紹介 4. 他製品との比較 2
3.
Spring Integrationとは? ? Spring Projectのひとつ ? EIP
(Enterprise Integration Patterns) に基 づくアプリケーション開発をサポートするフ レームワーク ? 多彩なアダプタで外部サービスとの接続もサ ポート ? Spring XD(ビックデータ解析)のベースに もなっている 3
4.
EIPとは? ? エンタープライズ統合の 方式をパターン化 ? 65パターン ? http:// www.eaipatterns.com / 4
5.
EIPとは? Message Router Polling Consumer Publish-Subscribe
Channel 5
6.
本日のアジェンダ 1. Spring Integrationとは 2.
Spring Integrationの基本構成要素 3. サンプル紹介 4. 他製品との比較 6
7.
Spring Integration の 基本構成要素 ? Message ? Message
Channel ? Endpoint Message Endpoint Channel Message Endpoint 7 Channel Endpoint
8.
Message ? Spring Integration内でやり取りするデータを示すオブジェクト ? HeaderとPayloadで構成 ? HeaderはMapString, Object、Payloadは任意のオブジェクト ? Headerにはid,
timestamp, priorityなどの予め定義されている項目もある public interface MessageT { MessageHeaders getHeaders(); T getPayload(); } ! public final class MessageHeaders implements MapString, Object, Serializable { …省略… } 8
9.
Message Channel ? Messageの伝送路を示す ? 2種類の配信モード(P2P, Pub/Sub) ? P2Pモードは1つの受信者に届く ? Pub/Subは登録している受信者すべてに届く 9
10.
Message Channel ? MessageChannel public interface
MessageChannel { boolean send(Message? message); ! boolean send(Message? message, long timeout); } ? 送信のみ定義。 PollableChannel public interface PollableChannel extends MessageChannel { Message? receive(); ! Message? receive(long timeout); } ? 能動的に受信する。 SubscribableChannel public interface SubscribableChannel extends MessageChannel { boolean subscribe(MessageHandler handler); boolean unsubscribe(MessageHandler handler); } 10 登録したHandler に配信される。
11.
Message Channel ? PollableChannel ? ? PriorityChannel:PRIORITYヘッダの値で並び替え。 ? ? QueueChannel:FIFOのキュー。 RendezvousChannel:容量0のキュー。 SubscribableChannel ? PublishSubscribeChannel:すべてのSubscriberに配布。 ? DirectChannel:1つのSubscriberのみに配布。channelのデフォルト ? ExecuterChannel:配布先が別スレッドで動作。 11
12.
Endpoint ? Service Activator ? Transformer ? Channel Adapter ? Filter ? Message
Bridge ? Router ? Gateway ? Splitter ? Resequencer ? Aggregator 12
13.
本日のアジェンダ 1. Spring Integrationとは 2.
Spring Integrationの基本構成要素 3. サンプル紹介 4. 他製品との比較 13
14.
Hello World Hello, Kuro Kuro String Service Activator String Hello World Service output
= “Hello, ” + input; 凡例: Channel 14 Endpoint POJO
15.
下準備 pom.xml !-- Spring Integration
-- dependency groupIdorg.springframework.integration/groupId artifactIdspring-integration-core/artifactId version2.2.6.RELEASE/version /dependency jarファイル 15
16.
Hello World:実装 bean定義ファイル int:channel id=inputChannel/ int:channel
id=outputChannel int:queue capacity=10/ /int:channel ! ! 1. 入出力Channelを定義。 2. Service Activatorを定義。 !-- inputChannel = HelloService#sayHello = outputChannel -- int:service-activator input-channel=inputChannel output-channel=outputChannel ref=helloService 3. Serviceはbeanとして定義。 method=sayHello/ beans:bean id=helloService class=“net.spring.HelloService/ HelloService.java public class HelloService { ! } public String sayHello(String name) { return “Hello, + name; } 16
17.
Hello World:テスト @Test public void
helloWorldTest() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext(/METAINF/spring/integration/helloWorld.xml); ! // 送信メッセージ MessageString message = MessageBuilder.String withPayload(Kuro).build(); ! // 送信 MessageChannel inputChannel = applicationContext.getBean(“inputChannel, MessageChannel.class); inputChannel.send(message); ! // 受信 PollableChannel outputChannel = applicationContext.getBean(outputChannel, PollableChannel.class); MessageString output = (MessageString) outputChannel.receive(); ! // 確認 logger.debug(output: + output.getPayload()); assertThat(output.getPayload(), is(Hello, Kuro)); } 17
18.
サービス呼出方法をかえる ? 同期Gateway ? 非同期Gateway ? File Adapter(Channel Adapter) 18
19.
Hello World:同期Gateway Kuro String Gateway Hello, Kuro String Service Activator Hello World Service 凡例:
Channel 19 Endpoint POJO
20.
Hello World:同期Gateway HelloWorldServiceGateway.java 1. interfaseを定義。 public
interface HelloWorldServiceGateway { public String sayHello(String name); } 2. request-channelとreply-channelに 入力と出力Channelを設定。 bean定義ファイル !-- HelloWorldService 同期Gateway -- int:gateway id=HelloWorldServiceGateway default-request-channel=inputChannel default-reply-channel=outputChannel service-interface=“net.spring.gateway.HelloWorldServiceGateway / 20
21.
Hello World:同期Gateway HelloWorldTest.java @Test public void
helloWorldServiceGatewayTest() throws Exception { ApplicationContext applicationContext = new ClassPathXmlApplicationContext( /META-INF/spring/integration/helloWorld.xml); ! HelloWorldServiceGateway gateway = applicationContext .getBean(HelloWorldServiceGateway, HelloWorldServiceGateway.class); String message = gateway.sayHello(Kuro); 呼出がシンプルになる。 ! assertThat(message, is(Hello, Kuro)); } 21
22.
Hello World:非同期Gateway Kuro String Gateway Hello, Kuro String Service Activator Hello World Service 凡例:
Channel 22 Endpoint POJO
23.
Hello World:非同期Gateway 1. interfaseを定義。返り HelloWorldServiceGatewayAsync.java 値の方はFuture。 public
interface HelloWorldServiceGatewayAsync { public FutureString sayHello(String name); } 2. request-channelとreply-channelに 入力と出力Channelを設定。 bean定義ファイル !-- HelloWorldService 非同期Gateway -- int:gateway id=HelloWorldServiceGatewayAsync default-request-channel=inputChannel default-reply-channel=outputChannel service-interface=net.spring.gateway.HelloWorldServiceGatewayAsync / 23
24.
Hello World:非同期Gateway HelloWorldTest.java @Test public void
helloWorldServiceGatewayAsyncTest() throws Exception { ApplicationContext applicationContext = new ClassPathXmlApplicationContext(/ META-INF/spring/integration/helloWorld.xml); ! HelloWorldServiceGatewayAsync gateway = applicationContext .getBean(HelloWorldServiceGatewayAsync, HelloWorldServiceGatewayAsync.class); FutureString future = gateway.sayHello(Kuro); ! String message = null; while (true) { 非同期で結果を取得。 if (future.isDone()) { message = future.get(); break; } } assertThat(message, is(Hello, Kuro)); } 24
25.
Hello World:File Adapter File Adapter Kuro File String Transformer Service Activator Hello, Kuro String hello-world-kuro.txt Hello
World Service 凡例: Channel 25 Endpoint POJO
26.
Hello World:File Adapter bean定義ファイル !--
HelloWorldScervice FileAdapter -- int-file:inbound-channel-adapter id=fileAdapter directory=file:${java.io.tmpdir} channel=filesInChannel filename-pattern=hello-world-*.txt int:poller fixed-rate=1000 / /int-file:inbound-channel-adapter ! int-file:file-to-string-transformer delete-files=true charset=UTF-8 input-channel=filesInChannel output-channel=inputChannel / 26
27.
Hello World:File Adapter HelloWorldTest.java @Test public
void helloWorldServiceFileAdapterTest() throws Exception { ApplicationContext applicationContext = new ClassPathXmlApplicationContext(/METAINF/spring/integration/helloWorld.xml); ! // ポーリングされるディレクトリにファイルを出力する。 String tmpdirPath = System.getProperty(java.io.tmpdir); String inputFilePath = tmpdirPath + hello-world-kuro.txt; File nameFile = new File(inputFilePath); OutputStream outputStream = new FileOutputStream(nameFile); outputStream.write(Kuro.getBytes()); outputStream.close(); // 受信 PollableChannel outputChannel = applicationContext .getBean(outputChannel, PollableChannel.class); MessageString output = (MessageString) outputChannel.receive(); assertThat(output.getPayload(), is(Hello, Kuro)); } 27
28.
File以外のAdapter ? AMQP ? JPA ? Stream ? Kafka* ? Feed ? JMS ? Syslog ? MQTT* ? File ? Mail ? Tail ? Print* ? FTP/FTPS ? MongoDB ? Twitter ? SMB* ? GemFile ? Redis ? Web Service ? SMPP* ? HTTP ? Resource ? XML ? Splunk* ? TCP/UDP ? RMI ? XMPP ? Voldemort* ? JDBC ? SFTP ? AWS* ? XQuery* 28 *extensions (https://github.com/spring-projects/spring-integration-extensions)
29.
STS(Spring Tool Suite) ?
STSを使うとフローを可視化できる。 ? 使い勝手はあまりよくない? 29
30.
その他のEndpoint ? Spritter ? Router ? Aggregator 30
31.
メッセージの永続化 ? キューにMessageStoreを設定することで可能 ? サポートしているMessageStore ? ? Redis ? MongoDB ? ? JDBC Gem?re ただし、キューの永続化にRDBMSは非推奨 int:channel id=outputChannel int:queue capacity=10
message-store=refMessagestore/ /int:channel 31
32.
本日のアジェンダ 1. Spring Integrationとは 2.
Spring Integrationの基本構成要素 3. サンプル紹介 4. 他製品との比較 32
33.
Spring Integrationの特徴 ? 既存のSpringアプリケーションとの相性がよい。 ? POJOを基本としているためコンポーネントの試験がしやすい。 ? 軽量(JUnitやWebアプリから起動可能)。 ? インストール不要(It s
a framework, not an application)。 ? OSSなのでソースコードを読んで拡張可能! ? XML地獄…。 33
34.
他製品との比較 ? Apache Camel ? Mule ESB 34
35.
Mule ESB ? エディタが非常にリッチ。 ? 要インストール(but easy)。 ? 実績多し。 ? 商用版のみの機能もあり。 35
36.
Apache Camel ? Spring Integrationと内容はほぼ一緒。 ? Springとも連携できる。 ? コンポーネントの種類は多い(AWSやFacebookやgmail)。 ? フロー記述のDSLはSpring
Integrationより明快。 ? 日本Apache Camelユーザ会が存在(国内実績もあり)。 public void configure() { from(“file:src/data?noop=true) .choice() .when(xpath(“/person/city=#39;London#39;)) .to(file:target/messages/uk) .otherwise() .to(file:target/messages/others); } 36 JACUG応援キャラクターのアイシャちゃん
37.
結局使いどころは? ? 既存のSpringアプリケーションにフロー制御を追加す る要件が出た場合 ? 信頼性(永続化)、運用性(リトライ、リスタート)、 拡張性(クラスタリング)については要処理方式検討 ? SpringXDにも期待 37
38.
まとめ Spring Integration ? EIPの参照実装 ?
Spring Integrationの基本 ? Message ? MessageChannel ? Endpoint ? Message ? Header ? Payload? ? MessageChannel ? P2P ? Pub/Sub ? Endpoint ? ServiceActivator ? 呼出 ? Gateway ? Channel Adapter ? 他製品 ? Mule ESB ? Apache Camel ? ? 38
39.
参考リンク集 ? Spring Integration? http://projects.spring.io/spring-integration/ ? Spring Integration
Samples? https://github.com/spring-projects/spring-integration-samples ? Spring Integration Extensions? https://github.com/spring-projects/spring-integration-extensions ? Spring Integration and EIP Introduction? http://www.slideshare.net/iweinfuld/spring-integration-and-eip-introduction ? Light-weight, Open-source Integration: Apache Camel vs. Spring Integration? http://java.dzone.com/articles/light-weight-open-source ? Which Integration Framework to use ? Spring Integration, Mule ESB or Apache Camel?? http://www.kai-waehner.de/blog/2012/01/10/spoilt-for-choice-which-integration-framework-to-use-spring-integration-muleesb-or-apache-camel/ ? Apache Camel? http://camel.apache.org/ ? 日本Apache Camelユーザー会? http://sourceforge.jp/projects/cameluserjp/wiki/FrontPage ? Mule ESB? http://www.mulesoft.org/ 39
Download