如何在 JSF 中创建更细粒度的 Web 套接字?

问题描述 投票:0回答:1

在我的 JSF 应用程序中,我尝试使用 Web 套接字将更新从后端推送到前端。后端在我正在收听的 ActiveMQ 主题上发布消息(在 @ApplicationScoped 级别)。

我有两个通过注入 @WebListener 创建的通道,如下所示:

@Inject
    public void setControllerEventChannel(@Push(channel = "controllerEventChannel") PushContext controllerEventChannel) {
        this.controllerEventChannel = controllerEventChannel;
    }

    @Inject
    public void setGroupEventChannel(@Push(channel = "groupEventChannel") PushContext groupEventChannel) {
        this.groupEventChannel = groupEventChannel;
    }
<o:socket channel="controllerEventChannel" onmessage="onMessage" />

<h:commandScript name="onMessage" actionListener="#{backingBean.controllerChannelCallback()}"
                             process="@this" update="@none"/>

挑战是,我有很多控制器和很多组。如何在这些通道上推送消息,以便所有打开的视图不会收到所有回调?这些视图是特定于控制器或组的。我当前的解决方案是在 actionListener 方法中过滤事件,总而言之,这很糟糕。

希望我可以动态创建频道,但我在 JakartaEE 中没有办法做到这一点?

jsf omnifaces
1个回答
1
投票

为此,您可以使用

user
属性,

<o:socket channel="some" user="#{user.id}">

Collection<Long> recipientUserIds = recipientGroup.getUserIds();
someChannel.send(message, recipientUserIds);

甚至

<o:socket channel="some" user="#{user.group.id}">

someChannel.send(message, recipientGroup.getId());
© www.soinside.com 2019 - 2024. All rights reserved.