使用服务器连接工厂/客户端连接工厂返回TCP适配器的连接状态

时间:2018-06-12 11:32:24

标签: spring-integration spring-integration-dsl

我想检查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。
  • 但是我在controlbusflow Bean定义中的服务激活器包含具有实际正确状态的消息,这意味着上述状态不是适配器的状态,实际状态是在controlBusFlow Bean中定义的服务激活器中接收的,

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

问题:

  • 如何在用户调用此方法时将应用程序配置为从isConnectionAdapterConnected(String connectionName)方法返回adpater的状态,因为在controlBusflow Bean Definition的服务激活器中收到了实际状态。
  • 另外,如何检查服务器连接工厂处于连接状态的TCP适配器的状态,因为此方法仅适用于具有客户端连接工厂的TCP适配器

修改

通过使用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

1 个答案:

答案 0 :(得分:2)

  

当用户调用此方法时,如何在controlBusflow Bean定义的服务激活器中收到实际状态时,如何配置应用程序以从isConnectionAdapterConnected(String connectionName)方法返回adpater的状态。

为此,您需要配置@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标头填充到发送到控制总线的消息中。然后将执行此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的简单服务中,让它通过控制总线执行。

相关问题