Spring integration 使用拆分器对几种网关方法重用service activator

Spring integration 使用拆分器对几种网关方法重用service activator,spring-integration,Spring Integration,是否有人知道使用多种方法(入站)重用服务激活器以及输出通道(尤其是使用拆分器和聚合器)是否有效 -->始终在网关上显示结果 在一些测试中,它似乎工作良好。当我添加了一个带有聚合器的拆分器时,我得到了错误的结果,路由到网关,然后网关失败,出现了一个转换异常(在我的例子中,它无法将布尔值转换为整数) 谢谢 保罗 流动 Spring集成配置 单元测试 @测试 公共无效sendMessageNoReceiver(){ assertFalse(gateway.sendToBulb(新HomeId(“

是否有人知道使用多种方法(入站)重用服务激活器以及输出通道(尤其是使用拆分器和聚合器)是否有效

-->始终在网关上显示结果

在一些测试中,它似乎工作良好。当我添加了一个带有聚合器的拆分器时,我得到了错误的结果,路由到网关,然后网关失败,出现了一个转换异常(在我的例子中,它无法将布尔值转换为整数)

谢谢

保罗

流动

Spring集成配置

单元测试
@测试
公共无效sendMessageNoReceiver(){
assertFalse(gateway.sendToBulb(新HomeId(“1”)、新BulbId(“1”)、BulbMessageBuilder.restart(“foo”);
}
@试验
public void sendMessageWithReceiver(){
MockSession bulbSession=新的MockSession(新的BulbBE(HomeId.of(“1”)、BulbId.of(“1”)、“bulb”、“pass”);
注册表。添加bulbSession(bulbSession);
assertTrue(gateway.sendToBulb(新HomeId(“1”)、新BulbId(“1”)、BulbMessageBuilder.restart(“foo”);
assertEquals(1,bulbSession.receivedMessages());
}
@试验
public void updateBulbStatus(){
最终模拟会话bulbSession1=新模拟会话(新BulbBE(HomeId.of(“1”)、BulbId.of(“1”)、“Bulbe”、“pass”);
assertFalse(gateway.updateLightStatus(bulbSession1.getIdentity());
注册表。添加BulbSession(bulbSession1);
assertTrue(gateway.updateLightStatus(bulbSession1.getIdentity());
assertEquals(1,bulbSession1.receivedMessages());
最终模拟会话bulbSession2=新模拟会话(新BulbBE(HomeId.of(“1”)、BulbId.of(“2”)、“bulb”、“pass”);
assertFalse(gateway.updateLightStatus(bulbSession2.getIdentity());
注册表。添加BulbSession(bulbSession2);
assertTrue(gateway.updateLightStatus(bulbSession2.getIdentity());
assertTrue(gateway.updateLightStatus(bulbSession2.getIdentity());
assertEquals(2,bulbSession2.receivedMessages());
assertEquals(1,bulbSession1.receivedMessages());
}
@试验
public void updateHomeBulbStatus(){
最终HomeBE home=新HomeBE();
setId(新ObjectId());
final MockSession bulbSession1=新的MockSession(新的BulbBE(home.getStrongId(),BulbId.of(“1”),“bulb”,“pass”);
注册表。添加BulbSession(bulbSession1);
final MockSession bulbSession2=新的MockSession(新的BulbBE(home.getStrongId(),BulbId.of(“2”),“bulb”,“pass”);
注册表。添加BulbSession(bulbSession2);
addbull(bulbSession1.getIdentity());
assertEquals(1,gateway.updateHomeLightStatus(主页));
assertEquals(1,bulbSession1.receivedMessages());
assertEquals(0,bulbSession2.receivedMessages());
addbull(bulbSession2.getIdentity());
assertEquals(2,gateway.updateHomeLightStatus(主页));
assertEquals(2,bulbSession1.receivedMessages());
assertEquals(1,bulbSession2.receivedMessages());
}
如果与其他测试一起执行,则最后一个测试将失败。如果单独执行,则通过


错误在于最后一个方法(使用拆分器)现在接收到一个布尔值,这似乎是注册的其他两个方法的结果。这些方法的结果是一个布尔值。

请就此事共享配置

根据您的图表,如果您尽可能减少配置以隔离问题,则效果会更好

请从另一方面说得更具体一些:你们的问题完全不清楚

那是你自己的服务。我们如何确保在不同的地方使用它是安全的?只有作为作者的你才能决定这一点

更新

抱歉耽搁了。他正忙于发布

感谢您为您的用例共享配置

现在我明白了问题所在

您可以在网关方法的任何地方使用
回复频道
。当您需要时,请参阅有关该事项的说明:

通常,您不必指定默认回复通道,因为网关将自动创建一个临时匿名回复通道,它将在其中侦听回复。但是,在某些情况下,可能会提示您定义默认回复通道(或带有适配器网关(如HTTP、JMS等)的回复通道)

由于在不同的位置使用相同的
bulbSendResult
,因此行为确实不可预测。而且,无论哪个频道是
直接频道
,都会出现
循环
平衡器

您应该完全摆脱那些
回复频道
,只需依赖
回复频道
标题的下游组件即可。因此,您应该删除组件中用于向网关返回回复的
输出通道

例如,最后一个
服务激活器应如下所示:

<int:service-activator input-channel="bulbMessages" method="send">
    <bean class="activity.BulbWebsocketMessageSenderBA"/>
</int:service-activator>
请注意
中缺少的
输出通道。因此,它直接从标头向
replyChannel
发送应答,并作为
返回
更新HomelightStatus
网关的方法

另一个技巧是<代码> <代码>,它在“代码> >代码>流的中间发送消息到您的<代码> <代码>,并等待与顶层网关完全相同的回复——通过<代码> RealyChans标头。对于没有

输出通道的
,它是一个发送回复的黑盒。它只使用头中的
replyChannel

在收到
中的答复
网关
后,将消息推送到

当聚合器执行其逻辑时,结果将作为
的输出发送到顶级网关

就这些

让我知道什么
@Test
public void sendMessageNoReceiver() {
    assertFalse(gateway.sendToBulb(new HomeId("1"), new BulbId("1"), BulbMessageBuilder.restart("foo")));
}

@Test
public void sendMessageWithReceiver() {
    MockSession<BulbId, BulbBE> bulbSession = new MockSession<BulbId, BulbBE>(new BulbBE(HomeId.of("1"), BulbId.of("1"), "bulb", "pass"));
    registry.addBulbSession(bulbSession);
    assertTrue(gateway.sendToBulb(new HomeId("1"), new BulbId("1"), BulbMessageBuilder.restart("foo")));
    assertEquals(1, bulbSession.receivedMessages());
}

@Test
public void updateBulbStatus() {
    final MockSession<BulbId, BulbBE> bulbSession1 = new MockSession<BulbId, BulbBE>(new BulbBE(HomeId.of("1"), BulbId.of("1"), "bulb", "pass"));
    assertFalse(gateway.updateLightStatus(bulbSession1.getIdentity()));

    registry.addBulbSession(bulbSession1);
    assertTrue(gateway.updateLightStatus(bulbSession1.getIdentity()));
    assertEquals(1, bulbSession1.receivedMessages());

    final MockSession<BulbId, BulbBE> bulbSession2 = new MockSession<BulbId, BulbBE>(new BulbBE(HomeId.of("1"), BulbId.of("2"), "bulb", "pass"));
    assertFalse(gateway.updateLightStatus(bulbSession2.getIdentity()));

    registry.addBulbSession(bulbSession2);
    assertTrue(gateway.updateLightStatus(bulbSession2.getIdentity()));
    assertTrue(gateway.updateLightStatus(bulbSession2.getIdentity()));

    assertEquals(2, bulbSession2.receivedMessages());
    assertEquals(1, bulbSession1.receivedMessages());
}
@Test
public void updateHomeBulbStatus() {
    final HomeBE home = new HomeBE();
    home.setId(new ObjectId());

    final MockSession<BulbId, BulbBE> bulbSession1 = new MockSession<BulbId, BulbBE>(new BulbBE(home.getStrongId(), BulbId.of("1"), "bulb", "pass"));
    registry.addBulbSession(bulbSession1);
    final MockSession<BulbId, BulbBE> bulbSession2 = new MockSession<BulbId, BulbBE>(new BulbBE(home.getStrongId(), BulbId.of("2"), "bulb", "pass"));
    registry.addBulbSession(bulbSession2);

    home.addBulb(bulbSession1.getIdentity());

    assertEquals(1, gateway.updateHomeLightStatus(home));
    assertEquals(1, bulbSession1.receivedMessages());
    assertEquals(0, bulbSession2.receivedMessages());

    home.addBulb(bulbSession2.getIdentity());
    assertEquals(2, gateway.updateHomeLightStatus(home));
    assertEquals(2, bulbSession1.receivedMessages());
    assertEquals(1, bulbSession2.receivedMessages());
}
<int:service-activator input-channel="bulbMessages" method="send">
    <bean class="activity.BulbWebsocketMessageSenderBA"/>
</int:service-activator>
<int:chain input-channel="homeBulbEntity">
    <int:splitter expression="payload.bulbs"/>
    <int:header-enricher>
        <int:header name="bulbId" expression="payload.strongId"/>
        <int:header name="homeId" expression="payload.homeId"/>
    </int:header-enricher>
    <int:transformer method="bulbToLightStatus">
        <bean class="util.BulbTransformer"/>
    </int:transformer>
    <int:gateway request-channel="bulbMessages"/>
    <int:aggregator method="aggregate">
        <bean class="util.BooleanAggregator"/>
    </int:aggregator>
</int:chain>