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
相关产品推荐
相关产品推荐

