PrimeFaces 推送到 OmniFaces 推送迁移问题
PrimeFaces push to OmniFaces push migration questions
由于 PrimeFaces 推送即将停止,我开始迁移到 OmniFaces 推送。出于通知目的,一切都按预期工作,但我在我的应用程序上聊天,我在 OmniFaces 中遗漏了两件事:
1) 按需更改套接字的用户。我需要这个进行私人对话。在 PrimeFaces 上,我根据记录的用户 ID 为每个对话创建一个频道,并将其传递给其套接字组件的连接方法。对于 OmniFaces,我尝试将套接字组件放置在 PrimeFaces 输出面板中,将用户 属性 绑定到视图范围的 bean,根据 ajax 请求和 oncomplete 事件调用 OmniFaces.Push.open('channelName'),但我可以在 SocketObserver class(来自展示柜)上看到用户尚未更新。作为一种解决方法,我使用登录的用户 ID 作为用户创建了频道,如果与他当前正在通话的人不同的人发送消息,我会在 JavaScript 回调中忽略它而不是附加它。
2) 当我没有在 PushContext.send 上指定用户时,我希望将消息发送给频道上连接的每个人,类似于 PrimeFaces 上的“/channel/*”。我对此的要求是更新此聊天应用程序中 online/offline 用户的列表。作为一种解决方法,我可以为这些通知创建一个单独的通道,但由于应用程序不需要它来工作,我更愿意先在这里检查。
如有必要,我会添加代码,但首先我想检查这些概念是否存在于 OmniFaces 推送中。
谢谢
如果您像示例中那样在 o:socket
上使用 user
属性开始
<o:socket channel="sess" scope="session" user="#{pushTestUser}" />
1) 似乎可以通过使用 'user id' 来实现,如展示中所示 push test page
来自http://showcase.omnifaces.org/push/socket:
@Inject @Push
private PushContext someChannel;
public void sendMessage(Object message, User recipientUser) {
Long recipientUserId = recipientUser.getId();
someChannel.send(message, recipientUserId);
}
在此示例中,传递 User
,这是一个 'example' 对象,可以是您自己的对象或其他对象。在展示中,通过将 id 绑定到输入字段来传递用户,但这也可以在服务器端完成。由你决定
2) 似乎可以将消息发送到通用频道甚至群组,如 http://showcase.omnifaces.org/push/socket.
中所示
@Inject @Push
private PushContext someChannel;
public void sendMessage(Object message, Group recipientGroup) {
Collection<Long> recipientUserIds = recipientGroup.getUserIds();
someChannel.send(message, recipientUserIds);
}
这里的组是一个示例对象,它可以是您自己的,它可以从 'frontend' 传递或者只是在后端某处读取。它只需要包含订阅频道的用户 ID(可以映射 guid,不需要是内部用户 ID)。所有只是示例方法。
所以在我看来,两者似乎都是可能的。
在同一个 JSF 视图中更改 <o:socket user="#{...}">
值确实是不可能的(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>
由于 PrimeFaces 推送即将停止,我开始迁移到 OmniFaces 推送。出于通知目的,一切都按预期工作,但我在我的应用程序上聊天,我在 OmniFaces 中遗漏了两件事:
1) 按需更改套接字的用户。我需要这个进行私人对话。在 PrimeFaces 上,我根据记录的用户 ID 为每个对话创建一个频道,并将其传递给其套接字组件的连接方法。对于 OmniFaces,我尝试将套接字组件放置在 PrimeFaces 输出面板中,将用户 属性 绑定到视图范围的 bean,根据 ajax 请求和 oncomplete 事件调用 OmniFaces.Push.open('channelName'),但我可以在 SocketObserver class(来自展示柜)上看到用户尚未更新。作为一种解决方法,我使用登录的用户 ID 作为用户创建了频道,如果与他当前正在通话的人不同的人发送消息,我会在 JavaScript 回调中忽略它而不是附加它。
2) 当我没有在 PushContext.send 上指定用户时,我希望将消息发送给频道上连接的每个人,类似于 PrimeFaces 上的“/channel/*”。我对此的要求是更新此聊天应用程序中 online/offline 用户的列表。作为一种解决方法,我可以为这些通知创建一个单独的通道,但由于应用程序不需要它来工作,我更愿意先在这里检查。
如有必要,我会添加代码,但首先我想检查这些概念是否存在于 OmniFaces 推送中。
谢谢
如果您像示例中那样在 o:socket
上使用 user
属性开始
<o:socket channel="sess" scope="session" user="#{pushTestUser}" />
1) 似乎可以通过使用 'user id' 来实现,如展示中所示 push test page
来自http://showcase.omnifaces.org/push/socket:
@Inject @Push
private PushContext someChannel;
public void sendMessage(Object message, User recipientUser) {
Long recipientUserId = recipientUser.getId();
someChannel.send(message, recipientUserId);
}
在此示例中,传递 User
,这是一个 'example' 对象,可以是您自己的对象或其他对象。在展示中,通过将 id 绑定到输入字段来传递用户,但这也可以在服务器端完成。由你决定
2) 似乎可以将消息发送到通用频道甚至群组,如 http://showcase.omnifaces.org/push/socket.
中所示@Inject @Push
private PushContext someChannel;
public void sendMessage(Object message, Group recipientGroup) {
Collection<Long> recipientUserIds = recipientGroup.getUserIds();
someChannel.send(message, recipientUserIds);
}
这里的组是一个示例对象,它可以是您自己的,它可以从 'frontend' 传递或者只是在后端某处读取。它只需要包含订阅频道的用户 ID(可以映射 guid,不需要是内部用户 ID)。所有只是示例方法。
所以在我看来,两者似乎都是可能的。
在同一个 JSF 视图中更改 <o:socket user="#{...}">
值确实是不可能的(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>