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



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

我有一个带有eager=trueApplicationScoped 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将其注入任何前端代码中。

相关内容

  • 没有找到相关文章

最新更新