当前位置: 首页 > 知识库问答 >
问题:

Spring集成DSL:lambda在句柄方法中返回Message,例如使用委托SessionFactory?

习洲
2023-03-14

动机:我需要在路由到Sftp出站网关之前设置委托SessionFactory的threadKey,然后取消设置threadKey。

根据租户的不同,我需要使用不同的Sftp用户帐户。在我的应用程序中,用户帐户是一个配置问题。yml,我不想为每个新租户写单独的路由。

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

设置threadKey需要消息

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())

但这并不容易。可以与接受消息的句柄()一起使用的lambda

这只是一个示例,我希望我可以在lambda中使用带有消息的handle(),而不结束流。我该怎么做?

使现代化

DelegatingSessionFactory不是一个特别合适的例子。由于设置和清除线程键应该在sftp调用之前和之后进行,因此通知比在调用之前和之后定义处理程序更合适。


共有1个答案

司空实
2023-03-14

知道了。handle()的javadoc表示

如果您需要访问整个消息,请使用句柄(Class, GenericHandler)

Class参数必须是Message。类:

.handle(Message.class, 
    (message, headers) -> sftpSessionFactory
        .setThreadKey(message, headers.get("tenantId")))
 类似资料:
  • 我有以下2个组件,它们应该首先从Mongo中删除文档,然后从Elastic中删除。 主要流程: 服务: 不幸的是,deleteDocumentInMongo从未被调用。我可以在日志中看到bean已正确注册。 我是做错了什么,还是你需要更多的调试信息?如果我窃听手柄,则deleteDocumentInES。执行输入,但忽略mongo流。

  • 问题内容: CLLocationManager的委托方法 didChangeAuthorizationStatus和didUpdateToLocation 没有接到电话。 位置始终使用说明键已添加到info.plist中,并且在我首次启动应用程序时也收到通知。 我能够看到谷歌地图,但是我看不到当前位置,当我更改位置时,它不会更新。基本上不会调用委托方法。 //码 问题答案: 在您的代码中,您正在使

  • 在Kotlin中使用类委托时,可以覆盖成员。然而,关于代表团的参考页上说: 但是,请注意,以这种方式重写的成员不会从委托对象的成员中调用,委托对象只能访问其自己的接口成员实现。 我想重写委托对象的方法使用的属性,以便委托对象的方法调用此重写属性。正如文档所述,用关键字覆盖属性并不能实现这一点。有什么方法可以让我实现这种行为吗?如果不是,这是否表明我应该改用继承? 这是一个代码示例: 这段代码打印“

  • ILRuntime中使用委托 如果只在热更新的DLL项目中使用的委托,是不需要任何额外操作的,就跟在通常的C#里那样使用即可 如果你需要将委托实例传给ILRuntime外部使用,那则根据情况,你需要额外添加适配器或者转换器。 需要注意的是,一些编译器功能也会生成将委托传出给外部使用的代码,例如: Linq当中where xxxx == xxx,会需要将xxx == xxx这个作为lambda表达式

  • 本文向大家介绍C#中委托(Delegates)的使用方法详解,包括了C#中委托(Delegates)的使用方法详解的使用技巧和注意事项,需要的朋友参考一下 1. 委托是什么? 其实,我一直思考如何讲解委托,才能把委托说得更透彻。说实话,每个人都委托都有不同的见解,因为看问题的角度不同。个人认为,可以从以下2点来理解:  (1) 从数据结构来讲,委托是和类一样是一种用户自定义类型。  (2) 从设计

  • 本文向大家介绍PHP __call()方法实现委托示例,包括了PHP __call()方法实现委托示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP __call()方法实现委托。分享给大家供大家参考,具体如下: 委托是指一个对象转发或者委托一个请求给另一个对象,被委托的一方替原先对象处理请求。这类似于继承,和在子类中调用父类的方法有点儿相似。 但在继承时,父类与子类的关系是固定的