gpt4 book ai didi

java - 当(非 Web、非 JSF)事件调用时,需要更新浏览器上的数据

转载 作者:行者123 更新时间:2023-12-01 13:05:04 28 4
gpt4 key购买 nike

目前我正在使用javaEE7,我有一个场景如下。在我的 JSF Web 应用程序中,我有一个事件监听器(不是 JSF 事件),当事件调用时,它会执行某些操作,然后将这些信息更新到我的 Web 应用程序的浏览器。

我有一个ApplicationScoped bean 与eager=true ,在 init @PostConstruct 中初始化一个事件监听器。我的事件监听器(不是 JSF 事件监听器)如下所示

public class AMIEventListener extends AbstractManagerEventListener {
public void init(){
//handle connection to Asterisk server using AMI
}

@Override
protected void handleEvent(NewCallerIdEvent event) {
AsteriskCaller caller = new AsteriskCaller(event.getCallerIdName(), event.getCallerIdNum());
//CallerRestClient restClient = new CallerRestClient(caller);
//restClient.sendCallerInfo();
}
}

所以方法handleEvent正在调用特定事件 when the phone is rang ,并且我想将这些信息更新到浏览器屏幕上(屏幕弹出 CTI)。到目前为止我已经尝试过了

1.获取我的 ViewScoped bean 的实例。

这不适用于 FacesContext.getCurrentInstance() 返回 null。我认为这是因为我在一个单独的线程上,这是有道理的,因为这是一个事件监听器。

2.拥有一个Web服务,并使用Jersey客户端向Web服务发送数据。

我已成功将数据发送到我的 Web 服务 JAX-RS,但是从那里,我无法将数据发送到我的 JSF 网页。我阅读并知道JSF和JAX-RS是两种完全不同的技术,因此它们无法通信

有人可以建议我可以使用的架构吗?

3.我正在考虑使用PrimeFaces推送将数据更新到浏览器,但是,我只希望计算机浏览器显示此信息,而不是所有当前登录应用程序的人都可以看到数据。为此,我想到每个登录用户都会有自己的 channel@PushEndPoint接受与当前登录用户相关的某种类型的变量。这是一个可以接受的解决方案吗?所以我最终可能会拥有大约 50-100 个独立的 channel ,这会产生任何副作用吗?

最佳答案

您想要实现的就像一个通知系统,服务器可以主动向客户端发送数据,而无需客户端任何类型的触发器(例如单击按钮,打开页面) .

如果是这样的话,PrimeFaces Push 绝对是一个解决方案。我正在使用它在我的应用程序中实现通知系统。关于性能,您可以尝试谷歌搜索Atmosphere Framework,它用于PrimeFaces Push。

更新:

需要注意的一件重要事情是,要使 PrimeFaces Push 正常工作,您的服务需要能够访问 Web 应用程序的上下文。换句话说,实现必须在 WAR 项目内部完成。否则,如果您尝试将其放入 EJB 项目中,PushContext 将为 null。我的 NotificationServices 如下所示:

@WebService(serviceName = "NotificationServices")
@Named(value="notificator")
public class NotificationServices {

private final PushContext pushContext = PushContextFactory.getDefault().getPushContext();

/**
* Push a notification to a user
*/
@WebMethod(operationName = "pushNotification")
public void pushNotification(@WebParam(name = "username") String username,
@WebParam(name = "message") String message) {
pushContext.push("/notification/" + username, message);
}
}

因此,剩下的任务是在用户登录后将用户连接到他们自己的 channel 。在我的应用程序中,我使用用户名作为每个 channel 的唯一 key 。然后,您可以使用 @WebServiceRef 将上述 Web 服务注入(inject)到后端实现中的任何其他服务中。此时,如果您想向前端推送任何消息,只需调用 pushNotification 方法即可。

由于该服务也使用 @Named 注解,因此如果需要,您还可以使用 @Inject 将其注入(inject)到任何前端代码中。

关于java - 当(非 Web、非 JSF)事件调用时,需要更新浏览器上的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23331978/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com