首页 > 解决方案 > 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 推送中。

谢谢

标签: jsfomnifaces

解决方案


<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>

推荐阅读