Правильный способ обработать долго работающие логы очистки c в ответ на событие Netty channelInactive? - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть приложение Netty, которое отслеживает подключенные соединения через веб-сокет. Когда веб-сокет отключается, мне нужно выполнить некоторые логические операции c, которые очищают сохраненные данные в этом соединении. Я пытаюсь быть хорошим гражданином Нетти и не блокировать событие l oop с помощью этой логики очистки c, поэтому я запускаю все в CompletableFuture. Лог c выглядит примерно так:

  @Override
  public void channelInactive(ChannelHandlerContext ctx) {
    String connectionId = ctx.channel().id().asLongText();
    LOGGER.info("Web socket disconnected: {}.", connectionId);
    connectionStore
        .deleteConnection(connectionId)
        .thenCompose(
            (connection) → {
              LOGGER.info("Deleted connection {}, publishing event.", connectionId);
              return messageBusPublisher.publish(new DisconnectEvent(connectionId));
            })
        .thenAccept((v) -> LOGGER.info("Done cleaning up connection {}.", connectionId));
  }

Это приводит к таким лог-операторам:

2020-02-10 17:47:23,091 [nioEventLoopGroup-6-2] INFO  c.e.WebSocketFrameHandler - Web socket disconnected: acde48fffe001122-000080ec-00000004-d86b4b1c219b503a-d8239aa2.
2020-02-10 17:47:23,091 [nioEventLoopGroup-6-2] INFO  c.e.store.ConnectionStore - Attempting to delete connection for acde48fffe001122-000080ec-00000004-d86b4b1c219b503a-d8239aa2
2020-02-10 17:47:23,092 [nioEventLoopGroup-6-1] INFO  c.e.WebSocketFrameHandler - Web socket disconnected: acde48fffe001122-000080ec-00000003-60f2c3402164ad79-a7e03a19.
2020-02-10 17:47:23,092 [nioEventLoopGroup-6-1] INFO  c.e.store.ConnectionStore - Attempting to delete connection for acde48fffe001122-000080ec-00000003-60f2c3402164ad79-a7e03a19
2020-02-10 17:47:23,093 [nioEventLoopGroup-6-3] INFO  c.e.WebSocketFrameHandler - Web socket disconnected: acde48fffe001122-000080ec-00000005-6962838a219b52e9-e6ceac8b.
2020-02-10 17:47:23,093 [nioEventLoopGroup-6-3] INFO  c.e.store.ConnectionStore - Attempting to delete connection for acde48fffe001122-000080ec-00000005-6962838a219b52e9-e6ceac8b
2020-02-10 17:47:23,093 [nioEventLoopGroup-6-5] INFO  c.e.WebSocketFrameHandler - Web socket disconnected: acde48fffe001122-000080ec-00000007-ccfcc4a5219b57eb-d78fc5f5.
2020-02-10 17:47:23,093 [nioEventLoopGroup-6-4] INFO  c.e.WebSocketFrameHandler - Web socket disconnected: acde48fffe001122-000080ec-00000006-6c933ab1219b554f-2b3cf759.
2020-02-10 17:47:23,093 [nioEventLoopGroup-6-5] INFO  c.e.store.ConnectionStore - Attempting to delete connection for acde48fffe001122-000080ec-00000007-ccfcc4a5219b57eb-d78fc5f5
2020-02-10 17:47:23,093 [nioEventLoopGroup-6-4] INFO  c.e.store.ConnectionStore - Attempting to delete connection for acde48fffe001122-000080ec-00000006-6c933ab1219b554f-2b3cf759
2020-02-10 17:47:23,097 [lettuce-kqueueEventLoop-4-1] INFO  c.e.store.ConnectionStore - Successfully deleted connection for acde48fffe001122-000080ec-00000004-d86b4b1c219b503a-d8239aa2
2020-02-10 17:47:23,102 [lettuce-kqueueEventLoop-4-1] INFO  c.e.WebSocketFrameHandler - Deleted connection acde48fffe001122-000080ec-00000004-d86b4b1c219b503a-d8239aa2, publishing event.
2020-02-10 17:47:23,127 [lettuce-kqueueEventLoop-4-1] INFO  c.e.service.MessageBusPublisher - Attempting to publish message for acde48fffe001122-000080ec-00000004-d86b4b1c219b503a-d8239aa2
2020-02-10 17:47:23,866 [sdk-async-response-0-0] INFO  c.e.service.MessageBusPublisher - Successfully published message for acde48fffe001122-000080ec-00000004-d86b4b1c219b503a-d8239aa2
2020-02-10 17:47:23,866 [sdk-async-response-0-0] INFO  c.e.WebSocketFrameHandler - Done cleaning up connection acde48fffe001122-000080ec-00000004-d86b4b1c219b503a-d8239aa2

Проблема, с которой я сталкиваюсь, заключается в том, что когда происходит несколько отключений в В коротком порядке кажется, что полная логика очистки c запускается только для первых одного или двух соединений, и, кроме того, ничего после обработки начального вызова. Это означает, что соединения должным образом удалены из хранилища, но никакие последующие действия не выполняются. Я предполагаю, что это потому, что CompletableFuture, представляющий полную цепочку вызовов, ни к чему не привязан, поэтому, когда первые вызовы в цепочке завершены, обратные вызовы не выполняются.

Я пытался различные вещи, такие как использование ctx.channel().eventLoop().execute(...) для запуска кода очистки (и теоретически связать выполнение с событием канала l oop), но я вижу те же результаты.

Мой вопрос: что такое подходящий способ для запуска связанных задач ввода-вывода в ответ на события канала Netty?

1 Ответ

0 голосов
/ 11 февраля 2020

Как обсуждалось выше в комментариях, это не имело ничего общего с тем, как я справлялся с длительной работой, но вместо этого было отсутствие обработки ошибок в моем будущем.

Не забывайте всегда отлавливать исключения из ваше будущее, дети!

...