狠狠撸

狠狠撸Share a Scribd company logo
Spring Integration 概要
!

@Kuro
本日のアジェンダ
1. Spring Integrationとは
2. Spring Integrationの基本構成要素
3. サンプル紹介
4. 他製品との比較

2
Spring Integrationとは?
?

Spring Projectのひとつ

?

EIP (Enterprise Integration Patterns) に基
づくアプリケーション開発をサポートするフ
レームワーク

?

多彩なアダプタで外部サービスとの接続もサ
ポート

?

Spring XD(ビックデータ解析)のベースに
もなっている
3
EIPとは?
?

エンタープライズ統合の
方式をパターン化

?

65パターン

?

http://
www.eaipatterns.com
/
4
EIPとは?

Message Router

Polling Consumer

Publish-Subscribe Channel
5
本日のアジェンダ
1. Spring Integrationとは
2. Spring Integrationの基本構成要素
3. サンプル紹介
4. 他製品との比較

6
Spring Integration の
基本構成要素
?

Message

?

Message Channel

?

Endpoint
Message
Endpoint

Channel

Message
Endpoint
7

Channel

Endpoint
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
Message Channel
?

Messageの伝送路を示す

?

2種類の配信モード(P2P, Pub/Sub)

?

P2Pモードは1つの受信者に届く

?

Pub/Subは登録している受信者すべてに届く

9
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	

に配信される。
Message Channel
?

PollableChannel
?
?

PriorityChannel:PRIORITYヘッダの値で並び替え。

?
?

QueueChannel:FIFOのキュー。

RendezvousChannel:容量0のキュー。

SubscribableChannel
?

PublishSubscribeChannel:すべてのSubscriberに配布。

?

DirectChannel:1つのSubscriberのみに配布。channelのデフォルト

?

ExecuterChannel:配布先が別スレッドで動作。
11
Endpoint
?

Service Activator

?

Transformer

?

Channel Adapter

?

Filter

?

Message Bridge

?

Router

?

Gateway

?

Splitter

?

Resequencer

?

Aggregator

12
本日のアジェンダ
1. Spring Integrationとは
2. Spring Integrationの基本構成要素
3. サンプル紹介
4. 他製品との比較

13
Hello World
Hello,
Kuro

Kuro
String

Service
Activator

String

Hello World
Service
output = “Hello, ” + input;
凡例: Channel
14

Endpoint

POJO
下準備
pom.xml
!-- Spring Integration --	
dependency	
groupIdorg.springframework.integration/groupId	
artifactIdspring-integration-core/artifactId	
version2.2.6.RELEASE/version	
/dependency

jarファイル

15
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
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
サービス呼出方法をかえる
?

同期Gateway

?

非同期Gateway

?

File Adapter(Channel Adapter)

18
Hello World:同期Gateway
Kuro

String
Gateway

Hello,
Kuro

String

Service
Activator

Hello World
Service

凡例: Channel
19

Endpoint

POJO
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
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
Hello World:非同期Gateway
Kuro

String
Gateway

Hello,
Kuro

String

Service
Activator

Hello World
Service

凡例: Channel
22

Endpoint

POJO
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
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
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
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
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
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)
STS(Spring Tool Suite)
? STSを使うとフローを可視化できる。
? 使い勝手はあまりよくない?

29
その他のEndpoint
?

Spritter

?

Router

?

Aggregator

30
メッセージの永続化
?

キューにMessageStoreを設定することで可能

?

サポートしているMessageStore
?
?

Redis

?

MongoDB

?
?

JDBC

Gem?re

ただし、キューの永続化にRDBMSは非推奨
int:channel id=outputChannel	
int:queue capacity=10 message-store=refMessagestore/	
/int:channel
31
本日のアジェンダ
1. Spring Integrationとは
2. Spring Integrationの基本構成要素
3. サンプル紹介
4. 他製品との比較

32
Spring Integrationの特徴
?

既存のSpringアプリケーションとの相性がよい。

?

POJOを基本としているためコンポーネントの試験がしやすい。

?

軽量(JUnitやWebアプリから起動可能)。

?

インストール不要(It s a framework, not an application)。

?

OSSなのでソースコードを読んで拡張可能!

?

XML地獄…。
33
他製品との比較
?

Apache Camel

?

Mule ESB

34
Mule ESB
?

エディタが非常にリッチ。

?

要インストール(but easy)。

?

実績多し。

?

商用版のみの機能もあり。

35
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応援キャラクターのアイシャちゃん
結局使いどころは?
?

既存のSpringアプリケーションにフロー制御を追加す
る要件が出た場合

?

信頼性(永続化)、運用性(リトライ、リスタート)、
拡張性(クラスタリング)については要処理方式検討

?

SpringXDにも期待

37
まとめ
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
参考リンク集
?

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

More Related Content

Spring integration概要