php cdi

考虑尝试一个简单的Java EE 7原型应用程序,该应用程序涉及JAX-RS(REST),WebSockets和CDI。

注意 :不想让它成为破坏者-但本文主要讨论我在尝试使用Web套接字和使用CDI作为“胶水”(在Java EE应用程序中)使用REST时遇到的问题。 整合并未实现,但是仍然吸取了一些教训:-)

这个想法是使用REST端点作为Web套接字端点的“提要”,从而将数据“推送”到所有连接的客户端:

  • JAX-RS端点,它从其他来源接收数据(可能是实时的)作为Web套接字端点的输入
  • 将CDI事件用作黑白JAX-RS和WebSocket端点的粘合点,并“触发”有效载荷
    @Path("/feed")
    public class RESTFeed {@InjectEvent<String> event;@POST@Consumes(MediaType.TEXT_PLAIN)public void push(String msg) {event.fire(msg);}
    }
  • 在WebSocket端点实现中使用CDI Observer方法将数据推送到连接的客户端:

    public void onMsg(@Observes String msg) {//different WS enpoint instance - notice the hash code value in the server logSystem.out.println("WS End point class ID -- " + this.hashCode());try {client.getBasicRemote().sendText(msg);} catch (IOException ex) {Logger.getLogger(ServerEndpoint.class.getName()).log(Level.SEVERE, null, ex);}
    }

当然,目前还没有考虑到更详细的信息,例如性能,异步通信等。 更多实验

但这有可能吗?

这是我执行的步骤

  • 部署代码
  • 浏览到http:// localhost:8080 / Explore-WebSocket-CDI-Integration-Maven /并作为Web套接字客户端连接

  • 使用Postman在REST端点上触发HTTP POST请求

繁荣! Observer方法中的NullPointerException –我等待了几秒钟,然后现实击中了我!

根本原因(据我了解)

  • WebSocket端点的行为

WebSocket端点与JAX-RS资源类相似,因为每个连接的客户端都有一个Web套接字端点类的实例(至少默认情况下)。 WebSocket规范中明确提到了这一点。 客户端(对等方)连接后,就会创建一个唯一的实例,并且可以安全地将Web套接字会话对象(对等方的表示形式)作为实例变量进行缓存。 IMO,这是一个简单干净的编程模型

  • 但是CDI容器还有其他计划!

REST端点一旦触发CDI事件(响应POST请求),CDI容器就会创建WebSocket终结点(在本例中为CDI Observer)的其他实例。 为什么? 因为CDI bean本质上是上下文相关的 。 该应用程序不控制CDI bean的实例。 它只是使用它们(通过@Inject)。 由容器决定创建和销毁bean实例,并确保在相同上下文中执行的bean可以使用适当的实例。 容器如何确定上下文呢? 通过范围 -应用程序,会话,请求等…..

(再次,在CDI规范中明确提到)

因此,问题的要点是没有WebSocket终结点当前上下文的实例–因此,CDI将创建一个新实例以传递消息。 当然,这意味着实例变量将指向null,因此将指向NPE(Duh!)

WebSocket端点将使用哪个CDI范围? 我尝试了@ ApplicationScoped,@ SessionScoped和@RequestScoped却没有太多运气–仍然是一个新实例和一个NPE

还有其他选择吗?

  • 将会话集定义为静态变量将达到目的:

    private static Set<Session> peers = Collections.synchronizedSet(new HashSet());

但是,如果只是需要在观察者方法中处理特定于客户端的状态(只能作为实例变量处理),则IMO只是一种黑客手段,因此不可行–它势必会保持未初始化的状态。

  • 服务器发送事件 ? 但最终,SSE!= WebSocket。 如果用例要求服务器端仅“推送”,则可以选择。 SSE尚不是Java EE标准-Java EE 8可能使之成为可能

解决方法

我不是专家,但是我想这取决于WebSocket规范,以便更清楚地说明如何将其与CDI结合使用。 鉴于CDI是Java EE规范中必不可少的一部分,因此将其与其他规范(特别是以HTML5为中心的规范,例如JAX-RS,WebSocket等)进行无缝集成非常重要。

Bruno Borges的这篇文章链接了与JMS,CDI和WebSocket有关的类似问题以及它们如何相互集成。

我错过了明显的事情吗? 您有任何意见/解决方案吗? 请随时鸣叫! :-)

示例代码在GitHub上可用 (如果您想看一看)。 我在GlassFish 4.1和Wildfly 8.2.0上尝试过

我想现在就这些了。 :-)

干杯!

翻译自: https://www.javacodegeeks.com/2015/02/integrating-cdi-websockets.html

php cdi

php cdi_集成CDI和WebSockets相关推荐

  1. 集成CDI和WebSockets

    考虑尝试一个简单的Java EE 7原型应用程序,该应用程序涉及JAX-RS(REST),WebSockets和CDI. 注意 :不想让它成为破坏者-但这篇文章主要讨论了我在尝试使用Web套接字和使用 ...

  2. php cdi_使用CDI的InjectionPoint注入配置值

    php cdi 依赖注入是用于组织类依赖的一项出色技术. 当前类中需要的所有类实例都是在运行时从DI容器提供的. 但是您的配置呢? 当然,您可以创建一个" Configuration&quo ...

  3. php cdi_异步CDI事件

    php cdi 几天前,在我们的常规代码审查中,我的一位同事提出了一个问题,即如果可能,一次同时调用CDI观察者(这样的方法带有参数@Observes )将发生多次?用于不同的事件实例. 换句话说,在 ...

  4. php cdi_涉及CDI和JSF的过期对话的定制错误页面

    php cdi 自上次写博客以来已经有一段时间了. 我一直在想写一些技术博客,但最终却忙于其他事情. 上周,在Coderanch论坛上进行了非常有趣的讨论. 甚至更有趣,因为它涉及JBoss. 熟悉J ...

  5. php cdi_配置CDI对话的超时

    php cdi 在开发JSF应用程序时,CDI对话范围是一个很好的功能. 想象一下,您有大型数据表,需要很长时间才能加载. 由于高内存消耗,您通常不希望将加载的数据放置在会话作用域的Bean中. 而且 ...

  6. Netflix 开源用于 Spring Boot的 GraphQL 服务框架DGS

    作者 | Netflix 技术博客,策划 | 田晓旭 文章来源:架构头条 Netflix 公司着力开发的 Domain Graph Service(DGS)框架现已正式成为开源项目.DGS 框架简化了 ...

  7. Java MVC 1.0规范开始进入公开评审阶段

    \ 看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料! \ \\ JSR-371规范1.0(Model-View-Controller,MVC)开始进入公开评 ...

  8. Bert Ertman专访:将Spring及遗留应用迁移到Java EE 6平台

    本文来源于我在InfoQ中文站的采访文章,原文地址是:http://www.infoq.com/cn/articles/migrate-spring-legacy-to-javaee6 InfoQ:你 ...

  9. 使用WebSocket实现服务端和客户端的通信

    开发中经常会有这样的使用场景.如某个用户在一个数据上做了xx操作, 与该数据相关的用户在线上的话,需要实时接收到一条信息. 这种可以使用WebSocket来实现. 另外,对于消息,可以定义一个类进行固 ...

最新文章

  1. 在抖音推荐算法组工作的体验
  2. 使用证书保护网站--兼谈证书服务器吊销列表的使用
  3. Tomcat 服务自动启动
  4. 【75位联合作者Nature重磅】AI药神:机器学习模型有望提前五年预测白血病!
  5. python连接redis集群如何释放内存_python 连接redis集群
  6. Eight Queens UVa 750
  7. python3 pygame load图片不显示_关于pygame image.load函数的问题
  8. 向量自回归模型(VAR)及其R语言实现
  9. iOS人脸识别Demo
  10. 艾森豪威尔法则(四象限法则)
  11. 【游戏】任天堂Nintendo Switch超详细购买/使用指南以及注意事项(根据自己使用持续更新中...)
  12. 谈谈我所了解的数据分析行业(上)
  13. 115846-45-2、二肽标记肽Suc-GP-对硝基苯胺、 Suc-Gly-Pro-pNA
  14. Vue里面使用el-cascader 级联选择器 children为空 和获取value和label问题
  15. NOKIA N8 和 Nokia Qt SDK
  16. 百度排名批量查询_黄岛主:不限字数给你讲透百度霸屏引流细节思路与操作玩法...
  17. js实现简单“商品总价计算”
  18. JDK源码系列:Future是如何实现的?
  19. 服务器08r2系统怎么校时,在windows 2008 R2上建 SNTP/NTP 服务器及客户机校时设置
  20. 计算机桌面变成立体,win7系统将桌面变成立体桌面的两种方法

热门文章

  1. jzoj4231-寻找神格【线段树,数学】
  2. 【jzoj】2018.1.30NOIP普及组——模拟赛D组
  3. 【DP】Mod Mod Mod(CF889E)
  4. Sentinel(十六)之AHAS Sentinel 控制台
  5. Hadoop生态Flume(一)介绍
  6. java正则表达式中的坑String.matches(regex)、Pattern.matches(regex, str)和Matcher.matches()
  7. 再有人问你volatile是什么,就把这篇文章发给他
  8. URL的getFile()和getPath()方法的区别
  9. 同学们,看看这里吧!!!
  10. hql投影查询之—— [Ljava.lang.Object; cannot be cast to cn.bdqn.guanMingSys.entity.Notice