由于PrimeFaces push将停止,所以我开始迁移到OmniFaces push。出于通知的目的,这一切都如预期的那样工作,但是我在我的应用程序上有一个聊天,我在OmniFaces中遗漏了两样东西:
1)根据需要更改套接字的用户。我需要这个作为私人谈话。在PrimeFaces上,我根据记录的用户id为每个会话创建一个通道,并将它传递给他们套接字组件的connect方法。使用OmniFaces,我尝试将套接字组件放置在PrimeFaces输出面板中,将用户属性绑定到视图作用域bean,更新ajax请求上的面板和oncomplete事件调用OmniFaces.Push.open('channelName'),但是我可以在SocketObserver类(从展示中看到)上看到用户尚未被更新。作为一种解决办法,我使用记录的用户id作为用户创建了通道,如果某个与他目前正在交谈的人不同的人发送了一条消息,我将在JavaScript回调时忽略它,而不是附加它。
2)当我没有在PushContext.send上指定用户时,我希望消息被发送给在通道上连接的每个人,类似于PrimeFaces上的"/ channel /*“。我的要求是从这个聊天应用程序中更新在线/离线用户列表。一个解决办法--我可以为这些通知创建一个单独的通道,但是由于应用程序不需要这样做,我宁愿先在这里检查。
如果有必要,我将添加代码,但首先,我想检查这些概念是否存在于OmniFaces push中。
谢谢
发布于 2018-07-28 13:17:32
确实不可能在保持相同的JSF视图(ajax更新等)的同时更改<o:socket user="#{...}">值。根据第472期,它在OmniFaces 3.2-快照中得到了改进。
在同一个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>发布于 2018-07-02 20:07:37
如果您首先在o:socket上使用o:socket属性,如本例所示
<o:socket channel="sess" scope="session" user="#{pushTestUser}" />( 1)使用“用户id”似乎是可能的,正如在展示的推送测试页中所看到的那样
来自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,它是一个“示例”对象,可以是您自己的或者其他什么的。在展示中,用户通过将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);
}这里的组是一个示例对象,它可以是您自己的,可以从“前端”传递,也可以在后端的某个地方读取。它只需要包含订阅通道的用户的id(可以映射guids,不需要是内部用户id)。所有这些都只是示例方法。
所以在我看来两者都是可能的。
https://stackoverflow.com/questions/51141114
复制相似问题