ServiceActivatingHandler實現了MessageHandler接口,所以它是一個MessageHandler,在spring-integration中,它也叫做服務激活器(Service Activitor),因為這個類是依賴spring容器BeanFactory的,所以在這里我不能直接使用硬編碼的方式通過main方法直接構造ServiceActivatingHandler,而是使用@ServiceActivator
注解配合spring
ServiceActivatingHandler類
這個類重要的一點就是允許帶有返回值,如果有返回值,則需要配置一個輸出通道,將這個返回值,通過該輸出通道,傳遞到下一步(也可以通過該通道傳遞給發送者)
導入的包
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.config.EnableIntegration;
import org.springframework.integration.handler.ServiceActivatingHandler;
import org.springframework.messaging.*;
import org.springframework.messaging.support.GenericMessage;
代碼示例:A發送消息->B接收方處理->B返回值->A處理返回值
下面的代碼演示了A發送給B,B處理,又返回給A,A再處理,非常類似一次HTTP請求
@Configuration
@EnableIntegration
public class E5ServiceActivatingHandler {// 創建一個通道,用這個通道給B(messageHandler方法)發消息@Beanpublic SubscribableChannel inputChannel(){return new DirectChannel();}// B收到消息之后,如何處理,注意inputChannel 和 outputChannel @ServiceActivator(inputChannel = "inputChannel", outputChannel = "outputChannel")public String messageHandler(Message<String> msg) throws InterruptedException {System.out.println("收到入參了:" + msg.getPayload());Thread.sleep(10000);// 收到消息并處理完成之后,返回給發送方A一個返回值return "只買特斯拉";}// B返回給發送方A返回值是通過這個通道發送的@Beanpublic SubscribableChannel outputChannel(){return new DirectChannel();}public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(E5ServiceActivatingHandler.class);// 獲取返回通道,接收方B的返回值會通過該通道發給發送方ASubscribableChannel outputChannel = context.getBean("outputChannel", SubscribableChannel.class);// 發送方A如何處理B的返回值,這里我們通過MyHandler類outputChannel.subscribe(new MyHandler());// 獲取輸入通道,發送方A通過該通道,將入參給BSubscribableChannel inputChannel = context.getBean("inputChannel", SubscribableChannel.class);// 創建發送方A的入參,參數內容為:"堅決不買國產新能源"Message<String> message = new GenericMessage<>("堅決不買國產新能源");// A發送給BinputChannel.send(message);}// 這個類決定A收到B的返回值之后如何處理這個返回值public static class MyHandler implements MessageHandler {@Overridepublic void handleMessage(Message<?> message) throws MessagingException {System.out.println("對方返回值:" + message.getPayload());}}}