使用Wildfly的集群式Singleton? - java

我正在尝试在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,而从另一个实例调用peek,我会看到这些值没有跨EJB复制。

我的印象是,群集单例将在两个应用程序服务器之间复制“ value”的值,无论我从哪个主机进行peek调用,都提供相同的值。这不正确吗?我缺少一些仍需要添加到此代码中的东西吗?

我会很感激您能给我任何帮助!谢谢!

java大神给出的解决方案

单例会话Bean提供了一种正式的编程结构,该结构可确保会话Bean将在特定Java虚拟机(JVM)中的每个应用程序实例化一次。

JSR 318:Enterprise JavaBeans TM版本3.1说:

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

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

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

看到:

Implement an HA Singleton
cluster-ha-singleton: A SingletonService deployed in a JAR started
by SingletonStartup and accessed by an EJB

更新:

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

参见:WildFly 10 Final is now available!

DataSourceTransactionManager和JndiObjectFactoryBean和JdbcTemplate的用途是什么? - java

以下的用途是什么:org.springframework.jdbc.core.JdbcTemplate org.springframework.jdbc.datasource.DataSourceTransactionManager org.springframework.jndi.JndiObjectFactoryBean <tx:annotatio…

用Java封装对象? - java

private中的Java提供类级别的封装。可以封装一个对象吗?还是这样做徒劳?例如,如果我们将一个类定义为 public class Person { private String ssn; private ArrayList<Person> friends = new ArrayList<Person>(); public voi…

Tomcat找不到直接放置在classes文件夹下的类 - java

我有以下JSP:<%@ page import="foo.*" %> <html> <body> The page count is: <%=Counter.getCount()%> </body> </html> 我在包Counter中有一个foo类,该类存储在: …

Java日期格式解析 - java

我正在尝试通过JSON响应更改日期格式,但我一直在获取java.text.ParseException。这是来自服务器2015-02-03T08:37:38.000Z的日期,我希望它显示为2015/02/03这是yyyy-MM-dd。而我做到了。DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd�…

快速解析来自http://bit.ly链接的方法 - java

给定来自流的一系列URL,其中可能有数百万个bit.ly,google或tinyurl缩短了链接,那么解析这些URL以获得最终URL的最可扩展的方法是什么?一个多线程爬虫在每个短链接上执行HEAD请求,同时缓存已经解决的请求?是否已经有提供此服务的服务?还要考虑到不会被url缩短服务阻止。假设规模是每天缩短2000万个网址。 java大神给出的解决方案 Go…