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

标签 java jsf jsf-2 primefaces glassfish

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

相关文章:

java - Android注释处理-为不同的构建风格生成不同的代码

java - 打开CSV将结果集导出为字符串类型

jsf - JSF 中的组件绑定(bind)是什么?何时首选使用?

jsf - 如何自定义 JSF 转换消息 'must be a number consisting of one or more digits' ?

jsf - 如何拦截 JSF View 解析以替换结果页面?

java - Android - 如何验证 url 并添加 http ://www

java - 不断获取结果集关闭sql异常

java - 如何使用 Primefaces 在 JSF 页面中显示来自 Java 缓冲区的消息

java - 如何在不渲染页面的情况下使用 Openfaces/JSF 调用方法?

java - Primefaces commandButton 在 Carousel 中不起作用