【问题标题】:what is a singleton class? Can it help me running single instance of a class for two related services?什么是单例类?它可以帮助我为两个相关服务运行一个类的单个实例吗?
【发布时间】:2009-09-29 20:07:00
【问题描述】:

这听起来可能很复杂,但我还是会问:

我正在运行一个使用类 X 的服务 A。我想启动另一个服务 B,它除了新类之外还使用类 A

服务 A 已在运行。我对服务 B 进行了热部署。

这是真正的问题 - 服务 B 将使用类 X 的相同实例还是单独的实例。单例类在这里如何帮助我?

【问题讨论】:

  • 我怎样才能使它成为可能-应该只有一个实例。

标签: web-services class singleton soa java-ws


【解决方案1】:

每个服务都将在自己的操作系统 (OS) 进程空间中运行,并且每个进程空间都有自己的类实例。 “单例”类通常使用类中的静态字段进行编码,这些字段对于代码运行的进程空间来说是本地的,所以不,它们不会共享单例。每个人都会得到自己的实例。

你可以做你想做的事,但是,使用一些外部共享同步过程,(例如,将一个单例暴露给 .Net Remoting(或 WCF)——一个网络暴露的端点,它是编码为使用单例,并让您的服务“连接”并使用远程访问的单例)

【讨论】:

  • 感谢您的回复。仅供参考,它是一项 Axis2 服务。让我们假设这两个服务都在同一台机器上运行。我怎样才能使它成为可能-应该只有一个实例。
  • 正如我所说,使用某种 java 远程处理,编码为 java 等价于 .Net MarshallByRef Singleton。 (一个服务的代码必须托管单例,而另一个必须“使用”它,即使它“存在于第一个”中。
  • 'java equivilent of .Net MarshallByRef Singleton' - 我必须找出答案。
【解决方案2】:

我不熟悉 Java Web 服务如何运行的细节,但如果它们都在同一个 VM 中运行,那么我认为这些类将在 VM 中的所有应用程序之间共享,因此静态字段将被共享.由于 Singleton 模式通常是通过将单个实例附加到静态成员来实现的,因此 Singleton 将被共享。

这基于:The Clean Code Talks - "Global State and Singletons"

您应该能够通过编写两个简单的 Web 服务来测试它。一个对单例做一些事情,例如设置一个标志,另一个检查它。

【讨论】:

    猜你喜欢
    • 2021-03-23
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2011-03-08
    • 2011-06-21
    • 1970-01-01
    相关资源
    最近更新 更多