Spring Integration DSL:lambda以句柄方法返回Message <t>,例如与DelegatingSessionFactory?

时间:2019-03-02 09:44:00

标签: spring-integration-dsl

动机:我需要先为DelegatingSessionFactory设置threadKey,然后再路由到Sftp出站网关,然后再取消设置threadKey。

根据承租人,我需要使用其他Sftp用户帐户。用户帐户是我的application.yml中的配置问题,我不想为每个新租户编写单独的路由。

public IntegrationFlow aDynamicSftpFlow() {
    f -> f
        .handle(tenantSessionDefine()) // how can I use a lambda instead?
        .handle(Sftp.outboundGateway(delegatingSessionFactory, ...))
        .handle(...) // undefine sftp session
}

设置threadKey需要Message<?>,而不仅仅是有效载荷和标头。所以我使用bean,因为它需要一条消息:

public class TenantSessionDefine {


    private DelegatingSessionFactory delegatingSessionFactory;

    public TenantSessionDefine(DelegatingSessionFactory delegatingSessionFactory) {
        this.delegatingSessionFactory = delegatingSessionFactory;
    }

    public Message<?> defineSession(Message<?> message) {
        return delegatingSessionFactory.setThreadKey(message, message.getHeaders()
            .get("tenantId", String.class)); 
// used by SessionFactoryLocator
    }
}

我想将其写为lambda,如

.handle(message -> delegatingSessionFactory.setThreadKey(message, 
    message.getPayload().getTenant())

但这不是那么容易。可以与采用handle()的{​​{1}}一起使用的lambda结束流程,因为它是void函数(Message<T>功能接口)。另一个lambda是GenericHandler,它不会结束流,但是会接收有效负载和标头,而不是消息。

这仅是一个示例,我不时希望我可以将MessageHandler与lambda中的消息一起使用而不会结束流程。我该怎么办?

更新

handle()并不是一个非常合适的示例。由于设置和清除线程密钥应该在sftp调用之前和之后发生,因此建议比在调用之前和之后定义处理程序更好。

1 个答案:

答案 0 :(得分:0)

知道了。 handle()的Javadoc说

  

如果您需要访问整封邮件,请使用handle(Class, GenericHandler)

Class参数必须为Message.class

.handle(Message.class, 
    (message, headers) -> sftpSessionFactory
        .setThreadKey(message, headers.get("tenantId")))