使用Wildfly的群集单身人士?

时间:2015-01-14 21:27:15

标签: java singleton ejb cluster-computing wildfly

我试图在Wildfly 8.2上创建一个简单的群集Singleton。我已经配置了2个Wildfly实例,这些实例在独立的群集配置中运行。我的应用程序已部署到两者,并且我可以毫无问题地访问它。

我的集群EJB看起来像这样:

@Named
@Clustered
@Singleton
public class PeekPokeEJB implements PeekPoke {

    /**
     * Logger for this class
     */
    private static final Logger logger = Logger
            .getLogger(PeekPokeEJB.class);

    private static final long serialVersionUID = 2332663907180293111L;

    private int value = -1;

    @Override
    public void poke() {
        if (logger.isDebugEnabled()) {
            logger.debug("poke() - start"); //$NON-NLS-1$
        }

        Random rand = new SecureRandom();
        int newValue = rand.nextInt();
        if (logger.isDebugEnabled()) {
            logger.debug("poke() - int newValue=" + newValue); //$NON-NLS-1$
        }

        this.value = newValue;

        if (logger.isDebugEnabled()) {
            logger.debug("poke() - end"); //$NON-NLS-1$
        }
    }

    @Override
    public void peek() {
        if (logger.isDebugEnabled()) {
            logger.debug("peek() - start"); //$NON-NLS-1$
        }

        if (logger.isDebugEnabled()) {
            logger.debug("peek() - value=" + value); //$NON-NLS-1$
        }

        if (logger.isDebugEnabled()) {
            logger.debug("peek() - end"); //$NON-NLS-1$
        }
    }
}

...我已经编写了一个非常简单的RESTful服务,让我通过浏览器调用这些方法......

@Path("/test")
@Named
public class TestRS extends AbstractRestService {
    /**
     * Logger for this class
     */
    private static final Logger logger = Logger.getLogger(TestRS.class);

    @Inject
    private PeekPoke ejb = null;

    @GET
    @Path("/poke")
    public void poke() {
        if (logger.isDebugEnabled()) {
            logger.debug("poke() - start"); //$NON-NLS-1$
        }

        this.ejb.poke();

        if (logger.isDebugEnabled()) {
            logger.debug("poke() - end"); //$NON-NLS-1$
        }
    }

    @GET
    @Path("/peek")
    public void peek() {
        if (logger.isDebugEnabled()) {
            logger.debug("peek() - start"); //$NON-NLS-1$
        }

        this.ejb.peek();

        if (logger.isDebugEnabled()) {
            logger.debug("peek() - end"); //$NON-NLS-1$
        }
    }
}

我可以从单个Wildfly实例调用peekpoke方法并获得预期值。但是,如果我尝试从一个实例调用poke,并从另一个实例查看,我看到这些值没有在EJB中复制。

我的印象是,群集单身人士会复制' value'跨两个应用程序服务器,无论我从哪个主机进行peek调用,都提供相同的值。这不正确吗?我是否遗失了仍需要添加到此代码中的内容?

我很感激你能给我的任何帮助!谢谢!

1 个答案:

答案 0 :(得分:6)

Singleton会话bean提供了一个正式的编程结构,可以保证会话bean在特定的 Java虚拟机(JVM)中实例化一次每个应用程序

JSR 318:Enterprise JavaBeans TM,版本3.1 说:

  

Singleton会话bean是一个会话bean组件   每个应用程序实例化一次。在容器是的情况下   分布在许多虚拟机上,每个应用程序都有一个   每个JVM的Singleton的bean实例

因此,在集群应用程序中,每个集群成员都有自己的单例会话bean实例,并且不在JVM实例之间共享数据(在Wildfly实现中)。

在Wildfly中,如果群集范围中只需要一个单例实例,则可以使用SingletonService实现。使用SingletonService,目标服务安装在集群中的每个节点上,但仅在任何给定时间在一个节点上启动。

请参阅:

更新:

  

WildFly 10增加了将给定应用程序部署为的能力   "单身部署" 。这是一项功能的新实现   存在于AS 6.0及更早版本中。当部署到一组群集时   服务器,单例部署将仅部署在单个节点上   任何给定的时间。如果部署处于活动状态的节点停止或   如果失败,部署将自动在另一个节点上启动。

请参阅:WildFly 10 Final is now available!