jsf - PrimeFaces 推送到 OmniFaces 推送迁移问题
问题描述
由于 PrimeFaces 推送即将停止,我开始迁移到 OmniFaces 推送。出于通知目的,这一切都按预期工作,但我在我的应用程序上进行了一次聊天,其中我在 OmniFaces 中缺少两件事:
1)按需更改socket的用户。我需要这个进行私人对话。在 PrimeFaces 上,我根据记录的用户 ID 为每个对话创建一个通道,并将其传递给他们的套接字组件的连接方法。使用 OmniFaces,我尝试将套接字组件放在 PrimeFaces 输出面板中,将用户属性绑定到视图范围的 bean,在 ajax 请求和 oncomplete 事件调用 OmniFaces.Push.open('channelName') 上更新面板,但是我可以在 SocketObserver 类(来自展示)上看到用户尚未更新。作为一种解决方法,我使用记录的用户 ID 作为用户创建了频道,如果与他现在正在交谈的人不同的人发送消息,我会在 JavaScript 回调中忽略它而不是附加它。
2) 当我没有在 PushContext.send 上指定用户时,我希望将消息发送给连接到频道的每个人,类似于 PrimeFaces 上的“/channel/*”。我对此的要求是更新此聊天应用程序中的在线/离线用户列表。一个解决方法我可以为这些通知创建一个单独的通道,但由于应用程序不需要这个工作,我更喜欢先在这里检查。
如有必要,我将添加代码,但首先我想检查这些概念是否存在于 OmniFaces 推送中。
谢谢
解决方案
<o:socket user="#{...}">
当停留在同一个 JSF 视图(ajax 更新等)时,确实不可能更改值。根据issue 472,它在 OmniFaces 3.2-SNAPSHOT 中得到了改进。
现在,在同一 JSF 视图中的任何 ajax 请求期间,值的任何动态变化<o:socket user="#{...}">
都将反映在推送行为中。
换句话说,现在可以进行以下构造:
<h:form>
<h:selectOneMenu value="#{bean.chat}">
<f:selectItems value="#{bean.chats}" />
<f:ajax render="@form" />
<h:selectOneMenu>
...
<o:socket channel="chat" user="#{bean.chat.id}" />
</h:form>