【发布时间】:2022-06-15 01:24:00
【问题描述】:
我有一个在 Wildfly 26 上运行的 Web 应用程序,它使用 SSE 广播并与 http 一起正常工作。但是,当我切换到使用 https 端点时,我得到以下 Wildfly 日志条目:
WARN [org.jboss.resteasy.resteasy_jaxrs.i18n](默认任务 1) RESTEASY002186:未能将 servlet 请求设置为异步模式, 服务器发送的事件可能不起作用
https 端点的每次注册尝试都会发生这种情况,但在使用 http 端点注册时我从未看到过这种情况。
使用 curl 对 http 端点进行测试会导致 curl 等待事件出现(并在收到事件时不断打印出来),直到我退出。使用 curl 测试 https 端点,我将看到从 http 端点得到的相同标头,即:
HTTP/1.1 200 OK
Connection: keep-alive
Transfer-Encoding: chunked
Content-Type: text/event-stream
但是在打印出我的注册成功事件后,curl 似乎认为流已关闭并退出 - 将我的命令提示符返回给我。
我的@GET MediaType.SERVER_SENT_EVENTS 注册端点将创建一个 OutboundSseEvent 并将其发送到 SseEventSink 以确认成功注册到我的 SseBroadcaster 实例(这是 curl 在退出之前看到并打印的事件)。然后,我在退出该方法之前记录一条注册成功消息。所有这些对于 http 和 https 似乎都可以正常工作,但是一旦请求端点完成,流就不会保持打开状态,因为如上所述的异步运行失败。
我没有找到有关我的 RESTEASY002186 问题的原因和/或解决方法的信息。上周我使用 Wildfly Google Group (https://groups.google.com/g/wildfly/c/SO2eHdvMEko) 发布了一个关于此问题的问题,但我认为我会尝试更广泛的受众,因为这似乎不是一种常见的情况。我在初始化期间没有看到任何迹象表明 WildFly 将无法使用异步模式,它只是在尝试失败时抱怨...任何帮助将不胜感激!
2022 年 6 月 6 日编辑 代码在一个隔离的网络上运行,所以我不能在这里剪切/粘贴代码,但我将资源文件删减到最低限度——只留下足够的空间让客户端能够注册。问题保持不变。代码现在基本上是:
@Path("sse")
public class SseResources {
@GET
@Produces(MediaType.SERVER_SENT_EVENTS)
public void listen(@Context Sse sse, @Context SseEventSink sseEventSink) {
SseRegComplete regComplete = new SseRegComplete("sse-server");
OutboundSseEvent event = sse.newEventBuilder().
name(regComplete.getType().toString()).
id(regComplete.getEventId()).
mediaType(MediaType.APPLICATION_JSON_TYPE).
data(SseRegComplete.class, regComplete).
comment("Event Stream Registration Completed Successfully").
build();
sseEventSink.send(event);
}
}
在上述简化代码之前,我已将资源声明为 @ApplicationScoped,将 Sse 注入其中,并保留对 SseBroadcaster 的引用,以便在有事件进入时使用它。我正在捕获要广播的事件通过使用@Observes 方法(我也摆脱了它)。我在监听方法中调用 SseBroadcaster 上的 register(sseEventSink) ,这样我以后可以在有更新要发布时调用 broadcast(outboundEvent) 。我摆脱了所有这些只是为了看看我是否可以让流保持开放但无济于事。在打印出上面代码中发送给它的 regComplete 事件后,我仍然收到 RESTEASY002186 消息并且 curl 仍然退出。
2022 年 6 月 7 日编辑 昨天,我能够通过these configuration instructions 使用 https 端点 URL 让我的代码在新的 vanilla Wildfly 26 安装中运行。我在原始帖子中没有提到的是我正在尝试将 SSE 功能添加到已经存在的应用程序中。它已经有几年历史了,我们实际上在大约 6 个月前迁移到 Wildfly 26,因为我们使用的 Wildfly 早期版本中存在 log4j 漏洞。我怀疑这个问题与我们的 Wildfly 配置有关(可能是因为旧的设置不应该被引入)或某些阻止 Wildfly 使用异步模式的第 3 方依赖项。
我们正在使用 Shiro 对 LDAP 服务器进行身份验证和授权——也许 Shiro 在 Wildfly 运行时中存在一些导致问题的钩子?初始登录后,我们在所有后续调用中使用会话 cookie。这与我的测试服务器有所不同,但我认为这无关紧要,因为调用在执行注册代码之前肯定通过了身份验证。现在唯一想到的另一件事是我们的 Web 应用程序附带 LogBack,并告诉 Wildfly 不要使用默认的日志记录框架。
我计划从今天开始比较两个standalone.xml 文件,看看是否有什么让我觉得根本不同的地方。还有什么我应该检查差异的(我认为某处有一个 domain.xml 文件......)?
2022 年 6 月 14 日编辑 这肯定与 Shiro 在循环中有关。当我编辑 web.xml 文件以使 Shiro 的过滤器映射 url-pattern 不包含 SSE 端点时,一切都按预期工作。
【问题讨论】:
-
你有没有某种复制器?
-
代码在一个孤立的网络上,所以我目前没有可以发布的任何内容。
-
我有一种感觉 :) 我会试着找点时间看看能不能用一些东西来重现它。
标签: wildfly resteasy server-sent-events shiro