在我的 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 中没有办法做到这一点?
为此,您可以使用
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());