我想检查TCP适配器(客户端/服务器连接工厂)的状态是否已连接适配器。
本问题将在此Question的后续版本中发布,但还有其他一些问题。
更改方法名称后:
从:isConnected()
到isClientModeConnected()
我必须更改控制Bus Bean定义 之前没有配置输出通道因此给出错误
@Bean
public IntegrationFlow controlBus() {
return IntegrationFlowDefinition::controlBus;
}
现在,
@Bean
public IntegrationFlow controlBusFlow() {
return IntegrationFlows.from(directChannel())
.controlBus().channel(directChannel()).handle(System.out::println)
.get();
}
另外,我的控制总线命令方法现在是,
public boolean isConnectionAdapterConnected(String connectionName) {
MessageChannel controlChannel = ac.getBean("controlBusFlow.channel#0", MessageChannel.class);
String exp = "@"+connectionName+"adapter"+".isClientModeConnected()";
boolean status = controlChannel.send(new GenericMessage<String>(exp));
return status;
}
isConnectionAdapterConnected(String connectionName)
方法中返回true。我创建了一个API,用户在其中调用函数来检查适配器的状态是否已连接。
问题:
isConnectionAdapterConnected(String connectionName)
方法返回adpater的状态,因为在controlBusflow Bean Definition的服务激活器中收到了实际状态。修改
通过使用Artem Bilan先生定义的appraoch,第一个问题得到了解决。
但是对于第二期:
这是在运行时使用唯一ID注册的集成流程。
IntegrationFlow flow =
IntegrationFlows.from(Tcp.inboundAdapter(Tcp.netServer(port)
.serializer(customSerializer)
.deserializer(customSerializer)
.id(connectionName+"server").soTimeout(10000)))
.enrichHeaders(f->f.header("abc","abc")))
.channel(directChannel())
.handle(Jms.outboundAdapter(ConnectionFactory())
.destination("jmsInbound"))
.get();
theFlow =this.flowContext.registration(flow).id(connectionName+".flow").register();
上面的流程以唯一ID注册,假设有3个服务器创建,则上面的3个流程将被注册(在for循环中迭代上述流程3次),
那么如何从注册流程中获取AbstractServerConnectionFactory
的引用,以便我可以获得openConnectionIds
。
答案 0 :(得分:2)
当用户调用此方法时,如何在controlBusflow Bean定义的服务激活器中收到实际状态时,如何配置应用程序以从isConnectionAdapterConnected(String connectionName)方法返回adpater的状态。
为此,您需要配置@MessagingGateway
发送到控制总线通道并期待回复。
使用boolean status = controlChannel.send(new GenericMessage<String>(exp));
执行的操作完全错误。 status
是MessageChannel.send()
操作的结果。与您的目标isClientModeConnected()
通话无关。
我会这样做:
@MessagingGateway(defaultRequestChannel = "controlBus.input")
public interface ControlBusGateway {
Object execute(String command);
}
...
@Bean
public IntegrationFlow controlBus() {
return IntegrationFlowDefinition::controlBus;
}
这样,将执行request-reply
方案,并且将replyChannel
标头填充到发送到控制总线的消息中。然后将执行此isClientModeConnected()
,结果将返回到网关调用。比你把它投入Boolean
并且那就是它!
服务器端根本与通道适配器无关。只有AbstractServerConnectionFactory
很重要。见:
/**
* Returns a list of (currently) open {@link TcpConnection} connection ids; allows,
* for example, broadcast operations to all open connections.
* @return the list of connection ids.
*/
public List<String> getOpenConnectionIds() {
关于此事。这正是加里所说的。我想你可以通过方法调用将这个调用包含在@ManagedAttribute
的简单服务中,让它通过控制总线执行。