代码之家  ›  专栏  ›  技术社区  ›  FkJ

Primefaces推到Omnifaces推迁移问题

  •  1
  • FkJ  · 技术社区  · 7 年前

    由于Primefaces推送将停止,我开始迁移到Omnifaces推送。出于通知的目的,这一切都按预期工作,但我在应用程序上进行了一次聊天,我在Omnifaces中缺少两件事:

    1)根据需要更改插座的用户。我需要这个私人谈话。在primefaces上,我根据记录的用户ID为每个会话创建一个通道,并将其传递给其socket组件的connect方法。对于Omnifaces,我尝试将Socket组件放入PrimeFaces输出面板中,将用户属性绑定到视图范围的bean,在Ajax请求和OnComplete事件调用Omnifaces.push.open(“channelname”)上更新面板,但在socketobserver类(从Showcase)上可以看到用户尚未更新。作为一个解决方法,我使用记录的用户ID作为用户创建了通道,如果有人与他当前交谈的人不同,发送了一条消息,我会在javascript回调中忽略它,而不是追加它。

    2)如果我没有在pushcontext.send上指定用户,我希望将消息发送给该频道上连接的所有人,类似于primefaces上的“/channel/*”。我的要求是更新这个聊天应用程序的在线/离线用户列表。A解决方法我可以为这些通知创建一个单独的通道,但是由于应用程序不需要这样做,所以我宁愿先检查这里。

    如果需要,我会添加代码,但首先我想检查一下这些概念是否存在于OmnifacesPush中。

    谢谢

    2 回复  |  直到 7 年前
        1
  •  2
  •   BalusC    7 年前

    确实不可能改变 <o:socket user="#{...}"> 值,同时保持在同一个JSF视图中(Ajax更新等)。按照 issue 472 在Omnifaces 3.2-Snapshot中进行了改进。

    价值的任何动态变化 <o:socket user=“…”> 在同一JSF视图中的任何Ajax请求期间,现在都将反映在推送行为中。

    换句话说,下面的构造现在是可能的:

    <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>
    
        2
  •  1
  •   Kukeltje    7 年前

    如果你开始使用 user 属性 o:socket 就像例子中那样

    <o:socket channel="sess" scope="session" user="#{pushTestUser}" />
    

    1)使用“用户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 这是一个“示例”对象,可以是您自己的或其他任何对象。在Showcase中,通过将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(可以是映射的guid,不需要是内部用户ID)。所有这些都只是示例方法。

    所以在我看来,两者都是可能的。