TcpNioClientConnectionFactory против TcpNetClientConnectionFactory - PullRequest
0 голосов
/ 28 марта 2019

Я использую:

  • весна-интеграция-ява-DSL-1.2.3.RELEASE
  • весна-интегрально-ф-4.3.19.RELEASE
  • весна-интеграция-клиент-4.3.19.RELEASE

Я хочу знать, в чем разница между этими двумя реализациями TcpNetClientConnectionFactory и TcpNioClientConnectionFactory.

Я создал приложение для подключения к серверу, и мое приложение должно поддерживать высокий объем транзакций в секунду, может быть, 100 транзакций в секунду.

Я не знаю, правильна ли моя реализация для поддержки больших объемов или нет.

Обычно для реализации NIO рекомендуется избегать блокировок, но я не знаю, изменит ли она тип реализации, улучшенной моим приложением.

public IntegrationFlow createTcpConnection(String connectionId, String host, int port, int headBytes,
        int retryInterval) 
{

    LOGGER.debug("createTcpConnection ->  connectionId: {} - host: {} - port: {} - headBytes: {} - retryInterval: {}"
            ,connectionId,host,port,headBytes,retryInterval);
    IntegrationFlow ifr = existsConnection(connectionId);
    if (ifr == null) {
        TcpNetClientConnectionFactory cf = new TcpNetClientConnectionFactory(host, port);
        final ByteArrayLengthHeaderSerializer by = new ByteArrayLengthHeaderSerializer(headBytes);
        cf.setSingleUse(false);
        cf.setSoKeepAlive(true);
        cf.setSerializer(by);
        cf.setDeserializer(by);
        cf.setComponentName(connectionId);

        //Inbound Adapter 
        TcpReceivingChannelAdapter adapter = new TcpReceivingChannelAdapter();
        adapter.setConnectionFactory(cf);
        adapter.setClientMode(true);
        adapter.setErrorChannelName("errorChannel");
        adapter.setRetryInterval(retryInterval);

        ifr = IntegrationFlows
                .from(adapter)
                .enrichHeaders(h -> h.header("connectionId",connectionId))
                .channel(fromTcp)
                .handle("BridgeMessageEndpoint", "outbound")
                .get();
        this.flowContext.registration(ifr).id(connectionId+CONNECTION_SUFFIX + ".in").addBean(cf).register();



        //OutBound Adapter
        TcpSendingMessageHandler sender = new TcpSendingMessageHandler();
        sender.setConnectionFactory(cf);
        IntegrationFlow flow = f -> f.handle(sender);
        this.flowContext.registration(flow).id(connectionId+CONNECTION_SUFFIX + ".out").register();

           LOGGER.debug("createTcpConnection: Connection created");
    }
    return ifr;
}

1 Ответ

0 голосов
/ 28 марта 2019

Вообще говоря, с точки зрения ввода / вывода, TcpNet* будет более эффективным для небольшого / среднего числа долгоживущих соединений.TcpNio* будет лучше для большого количества соединений и / или очень коротких соединений.

Если вы хотите обрабатывать входящие сообщения параллельно с конфигурацией TcpNet..., вы можете использовать канал исполнителя каквыходной канал адаптера, поэтому поток ввода-вывода передает работу другому потоку.

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