Skip to content

EventDispatcher: 未注册的事件类型抛出 HandlerNotFoundException 导致 WebSocket 断连 #185

Description

@ncw1992120

问题描述

当 WebSocket 长连接收到未在 EventDispatcher 中注册 handler 的事件类型时,SDK 抛出 HandlerNotFoundException。该异常在 ws.Client.handleDataFrame 中被内部 catch,SDK 发送 500 响应给飞书服务端,可能导致服务端主动断开 WebSocket 连接。

关键问题:异常在 SDK 内部被吞掉,应用层无法感知,且 SDK 没有提供 fallback handler 机制来让外部代码处理未注册的事件。

复现路径

  1. 使用 WebSocket 长连接模式
  2. EventDispatcher 只注册部分 IM 事件的 handler(如 P2MessageReceiveV1
  3. 飞书服务端推送未注册的事件(如 im.message.read_v1im.chat.member.bot.deleted_v1 等)
  4. SDK 抛出 HandlerNotFoundException → catch → 发送 500 → 连接可能断开

期望行为

  1. EventDispatcher.Builder 提供 fallback handler 机制(如 .onUnhandledEvent(handler)),让外部代码可以统一处理未注册的事件类型
  2. 或者未注册的事件类型被静默忽略(返回 200),而非抛异常导致 500 响应

当前版本

oapi-sdk: 2.6.1

当前 workaround

EventDispatcher.Builder 上为所有可能的事件类型注册空 handler,但这需要手动维护,且无法覆盖 SDK 未来新增的事件类型。

// 需要手动注册所有已知事件的空 handler
EventDispatcher.newBuilder("", "")
    .onP2MessageReceiveV1(handler)
    .onP2MessageReactionCreatedV1(event -> {})
    .onP2MessageReactionDeletedV1(event -> {})
    .onP2MessageReadV1(event -> {})
    .onP2MessageRecalledV1(event -> {})
    .onP2ChatMemberBotAddedV1(event -> {})
    .onP2ChatMemberBotDeletedV1(event -> {})
    // ... 还有更多
    .build();

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions