我目前正在开发一些旧的java代码,这些代码是在没有考虑到App服务器的情况下开发的。它基本上是一堆带有输入接口和输出接口的“黑盒代码”。“黑盒”类中的一切都是包含状态的静态数据结构,这些状态以一定的时间间隔(每10秒)通过算法。黑盒是从main方法启动的。
为了简单起见,我正在考虑将“黑盒”设为单例。基本上,任何想要访问黑盒内部逻辑的人都会得到相同的实例。这将允许我使用消息驱动bean作为黑盒的输入,并使用某种JMS发布器作为黑盒的输出。
这是一个多么糟糕的想法?有什么建议吗?
不过,我最关心的问题之一是,在“黑盒”代码中可能有我不知道的线程。
EJB中有“应用程序范围的对象”这样的东西吗?
注意:我使用的是Glassfish
发布于 2009-03-19 14:12:54
如果你使用简单的singelton,一旦你进入集群环境,你就会面临问题。
在这种情况下,您在多个JVM上有多个类加载器,并且您的sinlgeton模式将中断,因为您将拥有该类的多个实例。
在应用服务器中(可能是在集群环境中),单例的唯一可接受用法是当您的单例是完全无状态的,并且仅用于方便地访问全局数据/函数时。
我建议检查您的应用程序服务器供应商的解决方案以解决此问题。大多数供应商(如果不是所有供应商)都会为您的需求提供某种解决方案。
特别是Glassfish,你说你正在使用它,请查看。它可能和添加单个注释一样简单。
发布于 2009-03-19 02:22:24
我想说创建一个singleton实际上是唯一可行的想法。假设这个“黑盒”中的代码使用静态字段,那么创建这个facade的两个实例是绝对不安全的。否则,结果是不可预测的。
发布于 2009-03-18 23:35:26
这不仅不是一个坏主意,实际上对我来说听起来是一个潜在的相当好的想法。
仅仅从程序设计的角度来看:如果您的黑盒在概念上是一个“对象”,并具有在其上工作的属性和方法,那么将其转换为一个对象,即使它们中只有一个是实例化的。
https://stackoverflow.com/questions/660463
复制相似问题