Spring Integration Flow:基于没有SpEl表达式的标头的过滤器

时间:2019-02-26 22:17:31

标签: spring spring-integration spring-cloud-stream

我有以下Spring集成流程:

@Bean
public IntegrationFlow checkoutEventFlow(){
    return IntegrationFlows.from(EventASink.INPUT)
        .filter("headers['type'] == 'TYPE_A'") //1
        .transform(Transformers.fromJson(EventA.class)) //2
        .<EventA, EventB> transform(eventA ->
            new EventB(
                eventA.getSomeField(),
                eventB.getOtherField()))
        .handle(Http.outboundGateway(uri).httpMethod(HttpMethod.POST))
        .get();
}

1)我想根据邮件的标题过滤邮件而不使用SpEl表达式(请看// 1),可以吗?

2)是否存在另一种无需// 2的JSON转换为POJO的机制?我喜欢可以使用POJO编写@StreamListener的方式,并且可以在后台进行转换。

谢谢。

1 个答案:

答案 0 :(得分:1)

filter()中没有SpEL,您可以改为执行Java lambda:

.filter(Message.class, m -> m.getHeaders().get("type") == "TYPE_A")

Spring Cloud Stream是经过公证的框架,其中JSON作为数据的默认内容类型,流经该流并传入/传出目标消息传递系统。

Spring Integration是一个库,可用于构建集成应用程序。在这里,我们对某些默认的内容类型转换没有任何意见。没有任何开箱即用的猜测,因为JSON,您将要把传入的byte[]转换成某种POJO。尽管为了纪念一些与Spring Cloud Stream一样可见的可能性,我们在POJO方法调用程序中有一个钩子,可以将JSON转换为预期的POJO。但是,只有在自定义POJO方法也标记为@serviceActivator时,才对它们进行此操作。从这里开始,我们无法在.transform() lambda中假设您的期望。您需要使用method提供一些服务,并在以下位置使用它:

/**
 * Populate a {@link ServiceActivatingHandler} for the
 * {@link org.springframework.integration.handler.MethodInvokingMessageProcessor}
 * to invoke the {@code method} for provided {@code bean} at runtime.
 * In addition accept options for the integration endpoint using {@link GenericEndpointSpec}.
 * @param service the service object to use.
 * @param methodName the method to invoke.
 * @return the current {@link IntegrationFlowDefinition}.
 */
public B handle(Object service, String methodName) {

这种方式的工作方式与使用@StreamListener在Spring Cloud Stream中看到的方式相同。