我目前正在一些较老的java代码,开发,没有应用程序服务器中心。它基本上是一堆"黑箱码"与一种输入接口,和输出接口。一切都在"黑箱"类的静态数据结构,包含国家,它们把通过的算法在一定的时间间隔(每10秒)。黑匣子是开始从一个主要的方法。

保持这种容易为自己,我想到的"黑箱"一个单独的.基本上,任何人想要访问的内部逻辑的黑盒子将得到同样的实例。这将允许我使用信息驱动的豆作为输入到黑匣子和JMS发布某种类型的输出。

多么糟糕的想法是这样的?什么建议吗?

关注的主要问题之一,我们虽然是有可能的线在"黑箱"的代码,我不知道的。

是有这样的事情",应用程序范围内的对象,"若有可能请提供一个代码?

注:我使用我们

有帮助吗?

解决方案

如果您使用的是简单的singelton,您将面临的问题,一旦你进入一个集群环境

在这种情况下,您有多个JVM多个类加载器,和你的sinlgeton模式的休息,你将有一个类的几个实例。

用于在应用服务器(可能在集群环境中)一个singleton唯一可接受的用途是,当你的单身是完全无状态,而仅作为方便访问全局数据/功能。

我建议检查您的应用程序服务器供应商对这个问题的解决方案。大多数情况下,如果不是所有的供应商,提供一些解决方案为您的排序的要求。

具体地为Glassfish的,你说你正在使用,检查出的Singleton EJB支持对于Glassfish的 。这可能是因为添加单个注解一样简单。

其他提示

我要说的是,创建一个单实际上是唯一可行的想法。假设这个“黑匣子”里的代码已知使用静态字段,这是绝对不安全的创建这个门面的两个实例。结果是不可预知否则。

远不是一个坏主意,它实际上听起来好像可能相当的的想法。

只要从程序设计的角度来看:如果你的黑盒子是概念上的“对象”具有属性和对他们的工作方法,然后使之成为一个对象,即使将永远只能是他们中的一个实例

它应该工作,但也有一些问题,你可能要应对。

线程,如已提及。一个MDB在EJB容器中,你不能创建自己的线程中运行,所以你有一个潜在的问题存在。如果你有机会到实际的代码(这听起来像你这样做),你可能需要做一些重构要么消除线程或使用“批准”穿线方法。该CommonJ一个TimerManager可能会在你规定的情况下工作,因为它是在一个区间执行一些任务。有许多可用于大多数应用服务器实现(WAS和Weblogic的有它包括在内)。

类加载 - 这是依赖于你的配置。如果创建单和相同的EAR内MDB的操纵,你将被罚款。独立EAR的将意味着不同的类加载器和你单身的多个实例。无法在这是否会成为你的情况或没有更多的信息的问题发表评论。

我错过了点?你提到的“黑箱代码”包含的状态。多边开发银行可能会受到限制的每个目的地1个实例,但没有适当的配置,你最终会与一些多边开发银行。他们都以“黑匣子码”你的单一实例的工作。对于我来说,似乎这不是一个好主意,因为一个bean将覆盖一个其他的bean之前已经创造了几个基点的“黑箱代码”状态。

在我看来,该项目更符合你的要求是一个Boss下列步骤:.(如果你想在Boss作为候选).

标准下列步骤:示例

Mbean也可以部署为单一实例,在情况下的Boss聚类。

集群与Boss

我希望这对你有用。

拉法。

修复代码得到尽快摆脱静力学。 singleton被不正确的方向迈出的一步。 - 它们只是添加额外的误导

不要使用单身其中状态可能会改变。

暴露你的黑盒类的全局实例似乎不是要走的路。很多时候,单身会看起来他们会让事情变得更容易上你,并在某种程度上就可以了,但它经常回来咬你,你最终不得不重组大块代码的。

在web服务器的世界里,一个对象可以被作用域于该请求,会话,或者该应用程序。也许你需要的是一个应用程序范围的对象。

搜索“应用范围对象”或“应用寿命对象”。

的文档

为什么不创建的空白框啄停靠接口,让客户做出的HTTP调用?

国际海事组织,这是一个好主意,有您的辛格尔顿的EJB容器需要。在Java EE 6放置@Singleton注解你的会话bean为您提供了一个名为单。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top