java - Java App Server 中的单例。这个想法有多糟糕?

标签 java jakarta-ee jboss glassfish ejb-3.0

我目前正在处理一些较旧的 Java 代码,这些代码是在没有考虑应用服务器的情况下开发的。它基本上是一堆带有输入接口(interface)和输出接口(interface)的“黑盒代码”。 “黑匣子”类中的所有内容都是包含状态的静态数据结构,这些状态按时间间隔(每 10 秒)通过算法进行处理。黑盒是从 main 方法开始的。

为了让我自己轻松一点,我正在考虑将“黑匣子”变成单例。基本上,任何想要访问黑盒内部逻辑的人都会得到相同的实例。这将允许我使用 Message Driven bean 作为黑盒的输入,以及某种 JMS Publisher 作为黑盒的输出。

这是个多么糟糕的主意?有什么建议吗?

不过,我主要担心的一个问题是,“黑匣子”代码中可能存在我不知道的线程。

EJB 中有“应用程序范围对象”这样的东西吗?

注意:我使用的是 Glassfish

最佳答案

如果使用简单的单例,一旦进入集群环境就会遇到问题

在这种情况下,您在多个 JVM 上有多个类加载器,并且您的单一模式中断,因为您将拥有该类的多个实例。

在应用服务器(可能在集群环境中)中,单例的唯一可接受的用途是单例完全无状态,并且仅用作访问全局数据/函数的便利。

我建议检查您的应用程序服务器供应商针对此问题的解决方案。大多数(如果不是全部)供应商都会针对您的需求提供一些解决方案。

特别是你说你正在使用的 Glassfish,查看 Singleton EJB support for Glassfish .它可能就像添加单个注释一样简单。

关于java - Java App Server 中的单例。这个想法有多糟糕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/660463/

相关文章:

java - AWS Lambda 和 SQS : failure reporting

java - 嵌套 JSON 的问题

JavaEE 解决方案配置最佳实践

java - 指向 env var 的 jboss 缓存位置

eclipse - JBOSS 的库太多了! (m2eclipse的问题)

java - 返回已连接完整实体的选定属性

java - 为什么我不能将方法引用直接分配给 Object 类型的变量?

java - 如何循环遍历字符串并删除特定元素?

java - Angular 前端、Java 后端在 Docker 上的最佳部署模式

java - 如何从 Controller 内部的 URL 访问哈希值