我目前正在处理一些较旧的 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/