Java EE 容器中的嵌入式 XMPP 服务器会因为线程而有害吗?

Posted

技术标签:

【中文标题】Java EE 容器中的嵌入式 XMPP 服务器会因为线程而有害吗?【英文标题】:Can an embedded XMPP server in a Java EE container be harmful because of threads? 【发布时间】:2014-09-11 12:49:27 【问题描述】:

我玩了一点Vysper,将它嵌入到TomEE 的Java EE Web 应用程序中。 Vysper 是基于 Apache Mina 的 XMPP 服务器的 alpha/beta 版本,可以轻松嵌入到 Java 应用程序中。我可以成功地将 Vysper 实例实例化为 @Startup / @Singleton 范围的 bean。到现在为止还挺好。当我在 Eclipse 内部的香草 TomEE 实例中运行它时,它似乎工作正常。

但后来我记得 Java EE 应用程序不应该使用线程(请参阅堆栈溢出中的这个答案 - Why is spawning threads in Java EE container discouraged?)。如果我没记错的话,当有人需要从 Java EE 应用程序中运行这样的事情时,甚至还有线程包装器。

我知道 TomEE+ 使用 Quartz 和 ActiveMQ 作为后端来实现多个 Java EE 服务,但它们是容器的一部分,而不是 Web 应用程序的一部分。

我打赌 Mina 和 Vysper 在内部使用线程,所以我想知道在这种情况下将 Vysper 直接嵌入到 Java EE Web 应用程序中不是一个好主意。当然,我可以将 XMPP 服务器作为系统的另一个组件在容器之外运行,这在集群部署中也更有意义。

但是假设我在独立部署(单个 TomEE)中运行,将嵌入式 Vysper 运行到 Java EE Web 应用程序中可能是有害的,因为它在内部依赖于线程?如果不是,为什么?

【问题讨论】:

【参考方案1】:

有些事情是被禁止的,但它越来越不严格,并且 tomee(和大多数 EE 服务器)不会强制执行,否则你几乎无能为力。

你能得到的唯一惊喜就是期望被管理(安全、CDI、...),因为这不是容器线程,所以你不是。如果你接受这个游戏规则,那么没有问题。

PS:别忘了正确关闭你的线程

【讨论】:

以上是关于Java EE 容器中的嵌入式 XMPP 服务器会因为线程而有害吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java EE 容器中的同步请求-回复模式

各种容器与服务器的区别与联系:Servlet容器WEB容器Java EE容器应用服务器WEB服务器Java EE服务器

如何在 java 中使用 Smack XMPP 库处理 TLS 证书

Smack 是不是支持 XMPP 端到端加密 (E2EE)?

J2EE的13个规范

无法使用 java 中的 smack 库使用 xmpp 服务器登录