目前我正在使用javaEE7,我有一个如下的场景。在我的JSF web应用程序中,我有一个事件监听器(而不是JSF事件),当事件调用时,它会执行一些操作,然后将这些信息更新到我的web应用程序的浏览器中。
我有一个带有eager=true
的ApplicationScoped
bean,它在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个独立的频道,这会产生任何副作用吗?
您试图实现的功能就像一个通知系统,服务器可以主动向客户端发送数据,而无需客户端上的任何触发器(例如单击按钮,打开页面)。
如果是这样的话,PrimeFaces推送绝对是一个解决方案。我正在使用它在我的应用程序中实现通知系统。关于性能,您可以尝试在谷歌上搜索用于PrimeFaces推送的Atmosphere Framework。
更新:
需要注意的一点是,要使PrimeFaces Push工作,您的服务需要访问web应用程序的上下文。换句话说,实现必须在WAR
项目内部完成。否则,如果你试图把PushContext
放在EJB
项目中,它就会变成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);
}
}
因此,剩下的任务是在用户登录后将他们连接到自己的频道。在我的应用程序中,我使用username
作为每个频道的唯一密钥。然后,您可以使用@WebServiceRef
将上述web服务注入后端实现中的任何其他服务中。此时,如果您想将任何消息推送到前端,只需调用pushNotification
方法即可。
由于该服务还使用@Named
进行了注释,因此如果需要,还可以使用@Inject
将其注入任何前端代码中。