You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

okhttp-eventsource对接Wikimedia无数据接收排查求助

问题:无法通过okhttp-eventsource接收Wikimedia事件并传输到Kafka

我正在开发一个玩具项目,功能是接收Wikimedia事件并将其流式传输到Kafka。使用okhttp-eventsource连接Wikimedia,但无法接收任何数据,调试遇到困难。服务器运行正常,但看不到来自Wikimedia的事件。

核心代码

public void sendMessage() throws InterruptedException {
    String topic = "wikimedia_recent";
    BackgroundEventHandler backgroundEventHandler = new WikimediaChangesHandler(kafkaTemplate, topic);
    String url = "https://stream.wikimedia.org/v2/stream/recentchange";
    BackgroundEventSource.Builder builder = new BackgroundEventSource.Builder(backgroundEventHandler, new EventSource.Builder(URI.create(url)));
    try (BackgroundEventSource source = builder.build()) {
        source.start();
        System.out.println("source started");

    }
    TimeUnit.MINUTES.sleep(2);
}

事件处理方法(期望打印日志)

@Override
public void onMessage(String s, MessageEvent messageEvent) throws Exception {
    LOGGER.info(String.format("event data -> %s", messageEvent.getData()));
    kafkaTemplate.send(topic, messageEvent.getData());
}

调试日志

2024-02-25T12:31:56.676-05:00 DEBUG 3654 --- [-stream[null]-1] okhttp3.internal.http2.Http2             : >> CONNECTION 505249202a20485454502f322e300d0a0d0a534d0d0a0d0a
2024-02-25T12:31:56.678-05:00 DEBUG 3654 --- [-stream[null]-1] okhttp3.internal.http2.Http2             : >> 0x00000000     6 SETTINGS      
2024-02-25T12:31:56.679-05:00 DEBUG 3654 --- [-stream[null]-1] okhttp3.internal.http2.Http2             : >> 0x00000000     4 WINDOW_UPDATE 
2024-02-25T12:31:56.680-05:00 DEBUG 3654 --- [-stream[null]-1] okhttp3.internal.concurrent.TaskRunner   : Q10005 scheduled after   0 µs: OkHttp stream.wikimedia.org
2024-02-25T12:31:56.681-05:00 DEBUG 3654 --- [Http TaskRunner] okhttp3.internal.concurrent.TaskRunner   : Q10005 starting              : OkHttp stream.wikimedia.org
2024-02-25T12:31:56.681-05:00 DEBUG 3654 --- [-stream[null]-1] okhttp3.internal.concurrent.TaskRunner   : Q10001 scheduled after   0 µs: OkHttp ConnectionPool
2024-02-25T12:31:56.681-05:00 DEBUG 3654 --- [Http TaskRunner] okhttp3.internal.concurrent.TaskRunner   : Q10001 starting              : OkHttp ConnectionPool
2024-02-25T12:31:56.681-05:00 DEBUG 3654 --- [ ConnectionPool] okhttp3.internal.concurrent.TaskRunner   : Q10001 run again after   1 s : OkHttp ConnectionPool
2024-02-25T12:31:56.682-05:00 DEBUG 3654 --- [Http TaskRunner] okhttp3.internal.concurrent.TaskRunner   : Q10001 finished run in 428 µs: OkHttp ConnectionPool
2024-02-25T12:31:56.693-05:00 DEBUG 3654 --- [-stream[null]-1] okhttp3.internal.http2.Http2             : >> 0x00000003    75 HEADERS       END_STREAM|END_HEADERS
2024-02-25T12:31:56.743-05:00 DEBUG 3654 --- [m.wikimedia.org] okhttp3.internal.http2.Http2             : << 0x00000000    12 SETTINGS      
2024-02-25T12:31:56.745-05:00 DEBUG 3654 --- [m.wikimedia.org] okhttp3.internal.concurrent.TaskRunner   : Q10002 scheduled after   0 µs: OkHttp stream.wikimedia.org applyAndAckSettings
2024-02-25T12:31:56.745-05:00 DEBUG 3654 --- [Http TaskRunner] okhttp3.internal.concurrent.TaskRunner   : Q10002 starting              : OkHttp stream.wikimedia.org applyAndAckSettings
2024-02-25T12:31:56.746-05:00 DEBUG 3654 --- [yAndAckSettings] okhttp3.internal.concurrent.TaskRunner   : Q10004 scheduled after   0 µs: OkHttp stream.wikimedia.org onSettings
2024-02-25T12:31:56.746-05:00 DEBUG 3654 --- [yAndAckSettings] okhttp3.internal.http2.Http2             : >> 0x00000000     0 SETTINGS      ACK
2024-02-25T12:31:56.746-05:00 DEBUG 3654 --- [Http TaskRunner] okhttp3.internal.concurrent.TaskRunner   : Q10004 starting              : OkHttp stream.wikimedia.org onSettings
2024-02-25T12:31:56.747-05:00 DEBUG 3654 --- [Http TaskRunner] okhttp3.internal.concurrent.TaskRunner   : Q10002 finished run in   1 ms: OkHttp stream.wikimedia.org applyAndAckSettings
2024-02-25T12:31:56.747-05:00 DEBUG 3654 --- [Http TaskRunner] okhttp3.internal.concurrent.TaskRunner   : Q10004 finished run in 165 µs: OkHttp stream.wikimedia.org onSettings
2024-02-25T12:31:56.791-05:00 DEBUG 3654 --- [m.wikimedia.org] okhttp3.internal.http2.Http2             : << 0x00000000     0 SETTINGS      ACK
2024-02-25T12:31:56.946-05:00 DEBUG 3654 --- [m.wikimedia.org] okhttp3.internal.http2.Http2             : << 0x00000003   797 HEADERS       END_HEADERS
2024-02-25T12:31:56.947-05:00 DEBUG 3654 --- [m.wikimedia.org] okhttp3.internal.http2.Http2             : << 0x00000003     5 DATA          
2024-02-25T12:31:57.682-05:00 DEBUG 3654 --- [Http TaskRunner] okhttp3.internal.concurrent.TaskRunner   : Q10001 starting              : OkHttp ConnectionPool
2024-02-25T12:31:57.682-05:00 DEBUG 3654 --- [ ConnectionPool] okhttp3.internal.concurrent.TaskRunner   : Q10001 run again after   1 s : OkHttp ConnectionPool
2024-02-25T12:31:57.682-05:00 DEBUG 3654 --- [Http TaskRunner] okhttp3.internal.concurrent.TaskRunner   : Q10001 finished run in 397 µs: OkHttp ConnectionPool
2024-02-25T12:31:57.972-05:00 DEBUG 3654 --- [m.wikimedia.org] okhttp3.internal.http2.Http2             : << 0x00000003    15 DATA          
2024-02-25T12:31:57.973-05:00 DEBUG 3654 --- [m.wikimedia.org] okhttp3.internal.http2.Http2             : << 0x00000003   154 DATA          
2024-02-25T12:31:57.974-05:00 DEBUG 3654 --- [m.wikimedia.org] okhttp3.internal.http2.Http2             : << 0x00000003  1287 DATA          
2024-02-25T12:31:57.974-05:00 DEBUG 3654 --- [m.wikimedia.org] okhttp3.internal.http2.Http2             : << 0x00000003    15 DATA          
2024-02-25T12:31:57.975-05:00 DEBUG 3654 --- [m.wikimedia.org] okhttp3.internal.http2.Http2                 

调试建议

  • 修正try-with-resources作用域:当前代码中,BackgroundEventSource在try块结束后会被自动关闭,此时线程休眠的2分钟里,连接已经断开。把休眠代码移到try块内部,保证EventSource在休眠期间保持运行:
try (BackgroundEventSource source = builder.build()) {
    source.start();
    System.out.println("source started");
    TimeUnit.MINUTES.sleep(2); // 移至try块内
}
  • 补充Handler的全生命周期方法:只实现onMessage无法排查连接异常,重写onOpen、onError、onClosed方法并打印日志,确认连接状态:
@Override
public void onOpen() throws Exception {
    LOGGER.info("EventSource连接已打开");
}

@Override
public void onError(Throwable t) {
    LOGGER.error("EventSource发生错误", t);
}

@Override
public void onClosed() {
    LOGGER.info("EventSource连接已关闭");
}
  • 验证Wikimedia流格式:用curl直接请求https://stream.wikimedia.org/v2/stream/recentchange,确认返回内容是标准SSE格式(每行以data:开头),排除数据源本身的问题。

  • 检查日志输出级别:确保LOGGER的级别设置为INFO或更低,避免info日志被过滤。可以临时替换为System.out.println快速验证是否有事件输出。

内容的提问来源于stack exchange,提问作者Kabocha Porter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 06:29:51