目前我正在使用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/