endpoint閰嶇疆鐩稿姣旇緝鐏墊椿錛屼笅闈㈠啀鏉ョ湅涓涓緥瀛愶細
<endpoint input-channel="inputChannel"
default-output-channel="outputChannel"
handler-ref="helloService"
handler-method="sayHello"/>
<beans:bean id="helloService" class="org.springframework.integration.samples.helloworld.HelloService"/>
1 public class HelloService {
2
3 public String sayHello(String name) {
4 return "Hello " + name;
5 }
6 }
涓婇潰榪欎釜渚嬪瓙灝辨紨紺轟簡鎶?HelloService閰嶇疆鎴愪竴涓狹essageEndpoint緇勪歡錛屾秷鎭粠"inputChannel"闃熷垪鎺ユ敹鍚庯紝
璋冪敤HelloService.sayHello鏂規(guī)硶錛岀瓑sayHello鏂規(guī)硶榪斿洖鍚庯紝鏍規(guī)嵁default-output-channel="outputChannel"鐨勯厤緗?br />
鎶婅繑鍥炵殑緇撴灉淇濆瓨鍒癿essage.payload灞炴у悗鍙戦佺粰"outputChannel"闃熷垪
涔熷彲鏀規(guī)垚Annotation鐨勬柟寮忥紝閰嶇疆鏂規(guī)硶濡備笅錛?br />
<annotation-driven/>
<message-bus auto-create-channels="true"/>
<context:component-scan base-package="org.springframework.integration.samples.helloworld"/>
<beans:bean id="helloService" class="org.springframework.integration.samples.helloworld.HelloService"/>
1 @MessageEndpoint(input="inputChannel", defaultOutput="outputChannel")
2 public class HelloService {
3
4 @Handler
5 public String sayHello(String name) {
6 return "Hello " + name;
7 }
8 }
璁劇疆騫跺彂鎿嶄綔灞炴?br />
xml閰嶇疆錛?br />
<endpoint input-channel="exampleChannel" handler-ref="exampleHandler"/>
<!-- 璁劇疆騫跺彂璁劇疆 core鏍稿績綰跨▼鏁?nbsp;max鏈澶х嚎紼嬫暟 queue-capacity 闃熷垪鏈澶ф秷鎭暟 keep-alive idle綰跨▼鐢熷懡鏃墮棿-->
<concurrency core="5" max="25" queue-capacity="20" keep-alive="120"/>
</endpoint>
annotation閰嶇疆
1 @MessageEndpoint(input="fooChannel")
2 @Concurrency(coreSize=5, maxSize=20, queueCapacity=20, keepAliveSeconds=120)
3 public class FooService {
4
5 @Handler
6 public void bar(Foo foo) {
7 
8 }
9 }
涓嬮潰鎬葷粨涓涓嬪父瑙佺殑annotation鐨勪嬌鐢ㄦ柟娉?br />
@MessageEndpoint
瀹冭〃紺哄鐞嗘秷鎭璞$殑緇堢鑺傜偣銆備竴鑸笌鍏跺畠鐨勫厓鏁版嵁鏍囪涓璧蜂嬌鐢ㄣ?br />
涓嬮潰浼氬叿浣撲粙緇嶄笌璇ュ厓鏁版嵁鏍囪涓璧蜂嬌鐢ㄧ殑鍏跺畠鏍囪瘑鐨勪嬌鐢ㄦ柟娉曘?br />
@MessageEndpoint婧愪唬鐮侊細
1 @Target(ElementType.TYPE)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Inherited
4 @Documented
5 @Component
6 public @interface MessageEndpoint {
7
8 String input() default ""; //鎺ユ敹娑堟伅鐨勯槦鍒楀悕縐?/span>
9 String defaultOutput() default ""; //榛樿鍙戦佹秷鎭殑闃熷垪鍚嶇О(鍙湁鍦ㄤ笉璁劇疆@Router鎯呭喌涓嬫墠鏈夋晥)
10 int pollPeriod() default 0; //鍙戦佹秷鎭殑杞驚鏃墮棿闂撮殧(鍙湁鍦ㄤ笉璁劇疆@Router鎯呭喌涓嬫墠鏈夋晥)
11 }
@Handler
娑堟伅鍥炶皟澶勭悊鐨勬柟娉曘備笌@MessageEndpoint涓璧烽厤緗?span style="color: red;">(鍙檺M3鐗堬紝M4浠ュ強鍚庣畫鐗堟湰鍙互鍗曠嫭浣跨敤,鍏蜂綋浣跨敤鏂規(guī)硶榪樿絳夊叿浣撶殑瀹炵幇鍑烘潵)錛屾敹鍒癷nput闃熷垪鐨勬秷鎭悗錛屽洖璋傽Handler鏍囪瘑鐨勬柟娉?br />
鍥炶皟鏂規(guī)硶鐨勫弬鏁扮被鍨嬪繀欏諱笌message.payload灞炴х被鍨嬬浉鍚?br />
娉細濡傛灉鍥炶皟鏂規(guī)硶鏈夎繑鍥炲? 鍒欏洖璋冩柟娉曞鐞嗗畬鎴愬悗錛屼細灝嗚繑鍥炲艱緗埌message.payload灞炴у悗錛?br />
鍙戦佹秷鎭埌@MessageEndpoint鐨刣efaultOutput闃熷垪銆傚鏋渄efaultOutput娌℃湁璁懼畾錛屽垯灝嗘姏鍑哄紓甯搞?br />
@Handler婧愪唬鐮侊細
1 @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
2 @Retention(RetentionPolicy.RUNTIME)
3 @Inherited
4 @Documented
5 public @interface Handler {
6
7 }
涓嬮潰鐨勪緥瀛愭紨紺轟簡錛屼粠"channel1"闃熷垪鎺ユ敹娑堟伅鍚庣敱@Handler鏍囪鐨勬柟娉曞鐞嗐傛秷鎭殑payload灞炴у肩殑綾誨瀷蹇呴』涓庢柟娉曠殑鍙傛暟綾誨瀷鐩稿悓
1 @MessageEndpoint(input="channel1")
2 public class FooService {
3
4 @Handler
5 public void bar(Foo foo) {
6 
7 }
8 }
@Polled
蹇呴』涓嶡MessageEndPoint 涓璧蜂嬌鐢ㄣ備絾涔熷彲浠ヤ笌@Router,@Splitter鏍囪瘑閰嶅悎浣跨敤錛屽悗闈㈠啀鍒嗗埆涓句緥璇存槑銆?br />
@Polled 鐢ㄤ簬寮鍚竴涓疆寰殑鏂瑰紡璋冪敤鏂規(guī)硶鐨勫姛鑳?br />
瀹冩湁涓変釜鍙傛暟錛?br />
period: 杞驚鏃墮棿闂撮殧(鍗曚綅:寰) 榛樿涓?1000
initialDelay: 杞驚寤惰繜鏃墮棿(鍗曚綅:寰) 榛樿涓?
fixedRate: 榛樿涓篺alse
@Polled 婧愪唬鐮?br />
1 @Target(ElementType.METHOD)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Inherited
4 @Documented
5 public @interface Polled {
6 int period() default 1000;
7 long initialDelay() default PollingSchedule.DEFAULT_INITIAL_DELAY;
8 boolean fixedRate() default PollingSchedule.DEFAULT_FIXED_RATE;
9
10 }
涓嬮潰鏉ョ湅鍑犱釜渚嬪瓙錛?br />
渚嬪瓙1:
1 @MessageEndpoint(defaultOutput="outputChannel")
2 public class Counter {
3
4 private AtomicInteger count = new AtomicInteger();
5
6 @Polled(period=3000)
7 public int getNumber() {
8 return count.incrementAndGet();
9 }
10 }
榪欎釜渚嬪瓙鍔熻兘鏄紝MessageBus鍚姩鍚庯紝鐢盄Polled鏍囪 姣?縐掕Е鍙慻etNumber鏂規(guī)硶錛屽綋getNumber鏂規(guī)硶榪斿洖鍚庯紝
鎶婅繑鍥炲艱緗埌message.payload灞炴у悗錛屽彂閫佸埌outputChannel闃熷垪涓?br />
渚嬪瓙2:
1 @MessageEndpoint
2 public class Counter {
3
4 private AtomicInteger count = new AtomicInteger();
5
6 @Polled(period=3000)
7 public int getNumber() {
8 return count.incrementAndGet();
9 }
10
11 @Router
12 public String resolveChannel(int i) {
13 if (i % 2 == 0) {
14 return "even";
15 }
16 return "odd";
17 }
18 }
榪欎釜渚嬪瓙鍔熻兘鏄紝MessageBus鍚姩鍚庯紝鐢盄Polled鏍囪 姣?縐掕Е鍙慻etNumber鏂規(guī)硶, 褰揼etNumber鏂規(guī)硶榪斿洖鍚?
鐢變簬resolveChannel鏂規(guī)硶璁劇疆浜咢Router 鏍囪瘑錛屽垯鎶婃湁getNumber鏂規(guī)硶榪斿洖鍊奸兘浼氫紶緇檙esolveChannel鏂規(guī)硶錛屾渶鍚?br />
浼氭牴鎹柟娉曠殑榪斿洖鍊?鍗抽槦鍒楀悕縐? (@Router鏍囪鍔熻兘)錛屾妸娑堟伅鍙戝埌even闃熷垪鎴栨槸odd闃熷垪
娉細濡傛灉@MessageEndpoint綾諱腑錛屽湪鏂規(guī)硶涓婃爣璁頒簡@Router鏍囪鍚庯紝@MessageEndpoint鐨刣efaultOutput灝卞彉鎴愭棤鏁堜簡銆?/span>
@Splitter
蹇呴』涓嶡MessageEndPoint 涓璧蜂嬌鐢ㄣ?br />
璇ュ厓鏁版嵁鏍囪瘑鐢ㄤ簬鍒嗚В娑堟伅鍐呭錛屽畠鎵鍦ㄧ殑鏂規(guī)硶鐨勮繑鍥炲煎繀欏繪槸涓涓泦鍚?collection).濡傛灉闆嗗悎鍏冪礌涓嶆槸Message綾誨瀷
浣嗗彂閫佹椂錛岃嚜鍔ㄦ妸闆嗗悎涓殑鍏冪礌瀵硅薄淇濆瓨鍒癕essage.payload灞炴у悗鍙戦併傞泦鍚堜腑鏈夊灝戜釜鍏冪礌錛屽垯浼氬彂閫佸灝戞娑堟伅銆?br />
1 @Target(ElementType.METHOD)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Documented
4 @Handler
5 public @interface Splitter {
6 String channel(); //娑堟伅鍙戦佺殑闃熷垪鍚?/span>
7 }
涓嬮潰涓や釜渚嬪瓙瀹炵幇鏁堟灉鏄竴鏍風殑
渚嬪瓙1
1 @MessageEndpoint(input="inputChannel")
2 public class HelloService {
3
4 @Splitter(channel="outputChannel")
5 public List<String> sayHello(String name) {
6 String s = "Hello " + name;
7 List<String> list = new ArrayList<String>();
8 list.add(s);
9 return list;
10 }
11 }
12
渚嬪瓙2
1 @MessageEndpoint(input="inputChannel")
2 public class HelloService {
3
4 @Splitter(channel="outputChannel")
5 public List<Message> sayHello(String name) {
6 String s = "Hello " + name;
7 List<Message> list = new ArrayList<Message>();
8 Message message = new GenericMessage<String>(s);
9 list.add(message);
10 return list;
11 }
12 }
@Router
娑堟伅闃熷垪璺敱鍔熻兘銆?蹇呴』涓嶡MessageEndPoint 涓璧蜂嬌鐢ㄣ?br />
瀹冩墍鍦ㄧ殑鏂規(guī)硶鐨勮繑鍥炲肩被鍨嬪繀欏繪槸MessageChannle鎴栨槸String(channel name)綾誨瀷
鍏蜂綋鐨勪緥瀛愬弬鑰冧笂闈€?br />
@Publisher
蹇呴』涓嶡MessageEndPoint 涓璧蜂嬌鐢ㄣ?br />
璇存槑錛欯Publisher 鏍囪瘑鏄牴鎹?after-returning 鍒囬潰鐨凙OP 鍦ㄦ柟闈㈣繑鍥炲兼椂錛屽彂閫佹秷鎭埌鎸囧畾娑堟伅闃熷垪 .
涓嬮潰鐨勪緥瀛愶細璇存槑 foo鏂規(guī)硶璋冪敤鍚庯紝榪斿洖鍊間細鍙戦佸埌fooChannel娑堟伅闃熷垪
1 @Publisher(channel="fooChannel")
2 public String foo() {
3 return "bar";
4 }
@Subscriber
蹇呴』涓嶡MessageEndPoint 涓璧蜂嬌鐢ㄣ?br />
鎺ユ敹鎸囧畾闃熷垪鐨勬秷鎭唴瀹廣傚畠瀹炵幇鐨勫紓姝ョ殑娑堟伅鐩戝惉浜嬩歡銆?br />
涓鏃︽湁娑堟伅鎺ユ敹鍒幫紝鍒欎細鏍規(guī)嵁message.payload 鍊間綔涓哄弬鏁幫紝鍥炶皟@Subscriber 鏍囪瘑鏍囪鐨勬柟娉?br />
1 @Subscriber(channel="fooChannel")
2 public void log(String foo) {
3 System.out.println(foo);
4 }
Good Luck!
Yours Matthew!
2008騫?鏈?4鏃?br />

]]>