注意,标题中的 Gateway 是指 spring-integration 消息框架中的 gateway 并非 spring cloud gateway。

原文:https://docs.spring.io/spring-integration/reference/html/gateway.html


逻辑

简要来说,Messaging Gateway 就是在项目中只定义消息端点的接口(使用 Xml 或者 java 注解标识这个接口),接口的具体实现由 spring 容器实现(具体是 GatewayProxyFactoryBean 来创建接口实现)。

Messaging Gateway 产生的消息将根据消息头中的 request-channel 发送到对应的 channel,并由 reply-channel 中获取响应,如果没有指定 Channel,那么会默认创建一个匿名的 Channel,意味着由这个 Messaging Gateway 发出的消息无法前提创建或订阅,可以指定 default-request-channel 和 default-reply-channel 指定没有相应消息头时使用的 channel。

对于接口方法中的参数,默认是以 Map 作为消息头而具体的类作为消息的负载(payload),也可是使用注解直接指定。

对于没有参数的方法,这意味着不需要调用者传入而是借由 Messaging Gateway 自动生成。

对于消息处理过程中的异常,默认情况下会层层的向上传递,为了捕获相应的异常,可以在接口的方法上添加 throws 关键字定义需要捕获的异常。除此之外,还可以通过指定一个 errorChannel 将错误由指定的消息消费者处理。

对于 Messaging Gateway 还可以定义消息的等待时间 timeout,避免消息的处理时间过长,需要多线程的支持才是自动的,否者超时只能由下游的消费者主动执行。

Messaging Gateway 可以通过定义接口返回值(Future 等)的方式支持多种 Java 异步框架。

如果Messaging Gatewya 的请求消息得到 null 响应,那么就会一直重复发送,直到 replay-timeout 或者 requires-reply 在响应的消息体中被设置,(同样适用于下游适用 void 定义返回值,而 Messaging Gateway 接口方法非 void)。

使用

@MessagingGateway 对接口使用,@Gateway 对接口类的方法使用(就算没有 @Gateway 也会对所有接口方法生成具体实现,需要使用 proxyDefaultMethods 指定为 true,此时使用的 channel 等配置为 @MessagingGateway 上的值)。

方法的参数可以使用 @Header,@Payload 参数注解指定。参数的自动生成使用方法注解 @Payload,或者是 @Gateway 并指定 payloadExpression。

适用 throws Throwable 来定义需要处理的异常。

适用 Future,ListenableFuture 来定义异步的消息请求。