【问题标题】:How to let Lettuce notify application when connection is down?连接断开时如何让生菜通知应用程序?
【发布时间】:2018-11-28 09:19:27
【问题描述】:

我们在项目中使用生菜。我们需要监控连接状态。

我知道 Lettuce 可以在连接断开时重新连接 Redis。但是有什么方法可以通知应用程序连接断开/接通?

谢谢, 史蒂文

【问题讨论】:

  • 欢迎来到 Stack Overflow。第一个问题很好!

标签: connection lettuce


【解决方案1】:

Lettuce 为连接事件提供了一个事件模型。您可以订阅EventBus 并对总线上发布的事件作出反应。有多个事件,但对于您的情况,您需要监听连接和断开的事件:

  • ConnectionActivatedEvent:逻辑连接已激活,可用于调度 Redis 命令(SSL 握手完成,收到激活响应前 PING)
  • ConnectionDeactivatedEvent:逻辑连接已停用。内部处理状态被重置,isOpen() 标志设置为false

在接收到与传输相关的事件(例如 ConnectedEvent 和相应的 DisconnectedEvent)后会触发这两个事件。

以下示例说明了如何使用这些事件:

RedisClient client = RedisClient.create()
EventBus eventBus = client.getresources().eventBus();

Disposable subscription = eventBus.get().subscribe(e -> {

    if (e instanceOf ConnectionActivatedEvent) {
        // …
    }
});

…
subscription.dispose();
client.shutdown();

请注意,事件是异步分派的。事件监听器中发生的任何事情都应该是非阻塞的(即,如果您需要调用阻塞代码,例如进一步的 Redis 交互,请将此任务卸载到专用的Thread)。

了解更多

【讨论】:

  • 如果使用 Redis Sentinel 并且所有服务器都关闭,ConnectionWatchdog 开始尝试访问哨兵并连接到服务器的最后一个已知目的地。在此期间,将通知 Sentinel 和服务器的 ConnectedEvent、ConnectionActivatedEvent、DisconnectedEvent 和 ConnectionDeactivatedEvent(当它们最终重新连接时)。我如何了解 ConnectionActivatedEvent 是否来自服务器而不是哨兵?端口判断不靠谱。
  • 相关问题:为什么有一个专门的事件ReconnectFailedEvent,但是没有成功重新连接的事件,尽管正确记录了成功重新连接的事实?
  • 因为可以检测到失败的重连。一个连接建立信号是从接收连接事件而不知道来源的通用连接机制发出的(我们不能附加一个来源,因为它们是网络内部的)。
  • 发布了一个单独的问题(相关但主要与 Spring 有关):stackoverflow.com/q/63986017/1644036
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多