代码之家  ›  专栏  ›  技术社区  ›  Mark Elliot

Spring集成代理网关上的入站变压器

  •  1
  • Mark Elliot  · 技术社区  · 15 年前

    我想配置一个看起来像:

    Method Call -> Dynamic Proxy Gateway -> Channel -> Service Activator -> Method Call
                 ^---------- Transformer <- Channel <-             [return value]
    

    实际上,我想以某种方式访问隐藏的通道Spring集成创建并将返回消息有效负载转换为不同的消息类型。

    一个简单的解决方案可能首先是在网关上配置一个默认的回复通道,问题是我使用OSGi在包之间共享这个通道。服务激活器由bundle“b”提供,并为传入请求提供共享通道(它充当数据提供程序服务)。捆绑“a”需要一些数据,因此它请求它,但需要一个备用格式的结果。注意,如果bundle“b”能够使用bundle“a”指定的默认回复通道,那么bundle“a”必须共享它。这是公平的,很好,但是我在OSGi中有一个循环依赖,什么都不会开始。

    这里的另一个解决方案似乎是在服务激活器上定义一个输出通道,但这有一个稍微不同的问题。假设我共享bundle“b”的输出通道,我已经减轻了循环依赖性问题,但是现在每当有人请求bundle“a”的某些内容时,回复就会转到连接到输出通道的每个人身上——这也是不可取的。

    [ 编辑 :这里我的意思是,如果“b”为其服务激活器共享一个输入和一个输出通道,那么任何绑定到“b”的输出通道的人都将收到任何人对“b”的输入通道的请求的结果——并且所需的行为是,答复是针对请求者的。

    我需要注意的是,这里的变压器只在包A的上下文中才有意义。包B提供服务(对于所有的意图和目的,我都无法控制)。针对A包需求的转换应位于A包中。]

    所以,我认为我真正需要的是能够在对动态代理网关的响应上配置一个转换器,但是尽我所能在Spring集成手册中找不到这样的设备。一如既往,我们将非常感谢您的帮助。

    ——

    编辑2 :我在这里尝试了另外两种策略:

    1. 使用引用bundle b中的OSGi共享通道的服务激活器

      结果是返回的元素是一个GenericMessageType——它可以进行转换。GenericMessageType实际上是服务激活器必须指向的“send”方法的布尔结果,而不是回复消息。所以这个方法可以 工作。

    2. 使用标题丰富器设置 REPLY_CHANNEL 并将应答通道作为引用而不是值传递。

      这项技术确实 工作时,设置网关的默认答复通道(和默认答复通道)时,似乎忽略了reply_channel header元素 必须 被设置)。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Mark Elliot    15 年前

    理论上,这里真正的答案是使用链子。

    bundle A的配置如下

    <si:gateway id="gw" default-request-channel="xyz" />
    <si:channel id="xyz" />
    <si:chain input-channel="xyz" />
        <si:service-activator />
        <si:transformer />
    </si:chain>
    

    注意,对于bundle b,配置是不变的,只有一个通道通过OSGi共享,以便bundle a或任何第三级bundle访问。

    服务激活器有两个选项:

    1. 通过OSGi共享服务
    2. 只为转换前调用代理网关的自定义服务返回了数据类型。

    包A中的代理网关将注入一些输入通道“xyz”,最终隐含的返回通道将根据需要包含转换的内容。

    这个解决方案几乎与单镜头提出的解决方案相同,但是在这里,我们阻止通过OSGi共享真正的服务,维护包边界。

        2
  •  0
  •   SingleShot    15 年前

    我对你的问题描述有点困惑。我了解循环依赖方面和转换方面,但我不太确定“回复发给每个附加到a的人”。

    听起来您可能需要为B提供两个服务激活器。您在B中的现有激活器将保持不变,并且大多数客户机都会使用它。另一个将进入A,并且只使用A中定义的通道。这将防止A到B的请求导致响应被A之外的组件接收。

    这将使转换问题更容易解决。变形金刚从一个通道接收信息,转换它,然后将它放在另一个通道上。只要在A中加一个就可以了。

    因此,在中,您将拥有这些组件,只能由以下组件使用:

    • 网关
    • 输入通道
    • B的服务激活器
    • 输出通道
    • 变压器
    • 转换输出通道

    在B中,任何人都可以使用:

    • 输入通道
    • B的服务激活器
    • 输出通道

    A依赖B,B不依赖A。

    这样行吗?