Return TCP 适配器与服务器连接的连接状态 factory/Client 连接工厂

Return connection status for TCP adapter with Server Connection factory/Client Connection Factory

我想检查 TCP 适配器的状态(Client/Server 连接工厂)适配器是否已连接。

此问题是此 的后续问题,但还有一些其他问题。

更改方法名称后: 从:isConnected()isClientModeConnected()

我必须更改我的控制总线 Bean 定义 早些时候没有配置输出通道因此它给出错误

 @Bean
public IntegrationFlow controlBus() {
    return IntegrationFlowDefinition::controlBus;
}

现在,

@Bean
public IntegrationFlow controlBusFlow() {
    return IntegrationFlows.from(directChannel())
            .controlBus().channel(directChannel()).handle(System.out::println)
            .get();
}

还有,我现在控制Bus的命令方法是,

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;

    } 

我创建了一个 API,用户可以在其中调用函数来检查适配器的状态,无论其是否已连接。

问题:

编辑

通过使用 Artem Bilan 先生定义的方法,第一个问题得到解决。

但是对于第 2 期:

这是在运行时使用唯一 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.

How can I configure the application to return the status of the adpater from isConnectionAdapterConnected(String connectionName) method when the user calls this method as the actual status is received in Service activator of controlBusflow Bean Definition.

为此,您需要配置 @MessagingGateway 以发送到控制总线通道并等待回复。

你现在用 boolean status = controlChannel.send(new GenericMessage<String>(exp)); 做的是完全错误的。 statusMessageChannel.send() 操作的结果。没有与您的目标 isClientModeConnected() 调用相关的内容。

我会做的是这样的:

@MessagingGateway(defaultRequestChannel = "controlBus.input")
public interface ControlBusGateway {

    Object execute(String command);

}

...

@Bean
public IntegrationFlow controlBus() {
     return IntegrationFlowDefinition::controlBus;
}

这样 request-reply 场景将被执行,并且 replyChannel header 将被填充到发送到控制总线的消息中。那么这个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 将此调用包装到一个简单的服务,以让它通过控制总线执行。