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