Возврат статуса подключения для адаптера TCP с фабрикой соединений с сервером / фабрикой клиентских соединений - PullRequest
0 голосов
/ 12 июня 2018

Я хочу проверить состояние адаптера TCP (фабрика соединений клиент / сервер), подключен адаптер или нет.

Этот вопрос опубликован в продолжение этого Вопроса , нос некоторыми другими проблемами.

После изменения имени метода: с: 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;

    } 
  • независимо от того, подключен он или нет, всегдавернуть true в методе состояния isConnectionAdapterConnected(String connectionName).
  • Но мой активатор службы в определении bean-компонента controlbusflow состоит из сообщения с действительным правильным статусом, это означает, что вышеуказанный статус не является статусом адаптера, фактический статус получен в сервисеактиватор, определенный в bean-компоненте controlBusFlow,

Я создал API, в котором пользователь вызывает функцию, чтобы проверить состояние адаптера, подключен ли онcted или нет.

Проблема:

  • Как настроить приложение так, чтобы оно возвращало статус adpater из метода isConnectionAdapterConnected(String connectionName), когда пользователь вызывает этот метод в качестве действительного состоянияПолучено в активаторе службы определения beanflow bean.
  • Кроме того, как проверить состояние адаптера TCP, если фабрика соединений с сервером находится в подключенном состоянии, или нет, так как этот метод предназначен только для адаптера TCP с фабрикой клиентских соединений

РЕДАКТИРОВАТЬ

С помощью appraoch, определенного г-ном Артемом Биланом, первая проблема решена.

Но для второй проблемы:

Это поток интеграции, который регистрируется во время выполнения с уникальным идентификатором.

      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();

Вышеуказанный поток регистрируется с уникальным идентификатором, предположим, что создано 3 сервера, тогда будут зарегистрированы 3 вышеупомянутых потока (итерация вышеупомянутого потока 3 раза в цикле for), так как я могу получить ссылку AbstractServerConnectionFactory из зарегистрированного потока, чтобы я мог получить openConnectionIds.

1 Ответ

0 голосов
/ 12 июня 2018

Как настроить приложение так, чтобы оно возвращало статус adpater из метода isConnectionAdapterConnected (String connectionName), когда пользователь вызывает этот метод, когда фактический статус получен в активаторе службы определения компонента controlBusflow.

Для этого вам нужно настроить @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 в вызове метода, чтобы он мог выполняться через шину управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...