我有一个集群应用程序,在 jboss 6.1.0.Final 中运行了 2 个节点。
我有一些无状态 bean 需要在预定时间执行一些任务。它使用 EJB 3.1 计时器服务。这是其中之一:
@Stateless
public class MyBean implements MyBeanLocal,
MyBeanRemote {
@Schedule(hour = "1", persistent = false)
public void doStuff() { //my code }
}
直到这里,这完美地工作。
但由于我有 2 个节点,我需要仅在其中一个节点中执行 doStuff 方法,所以这是我的 META-INF/jboss.xml
<?xml version="1.0" encoding="UTF-8"?>
<jboss>
<enterprise-beans>
<session>
<ejb-name>MyBean</ejb-name>
<depends>jboss.ha:service=HASingletonDeployer,type=Barrier</depends>
</session>
</enterprise-beans>
</jboss>
当服务器启动时,我看到 MyBean 仅在其中一个节点中创建。
installing bean: jboss.j2ee:ear=my-ear.ear,jar=my-jar-0.0.1-SNAPSHOT.jar,name=MyBean,service=EJB3
with dependencies:
and demands:
jboss-switchboard:appName=my-ear,module=my-module-0.0.1-SNAPSHOT,name=MyBean; Required: Create
jboss.ejb:service=EJBTimerService; Required: Described
jboss-injector:topLevelUnit=my-ear.ear,unit=my-jar-0.0.1-SNAPSHOT.jar,bean=MyBean; Required: Described
jboss.ha:service=HASingletonDeployer,type=Barrier; Required: Described
persistence.unit:unitName=my-ear.ear/another-jar-dao-0.0.1-SNAPSHOT.jar#my-entitymanager; Required: Described
and supplies:
...
Added bean(jboss.j2ee:ear=my-ear.ear,jar=my-jar-0.0.1-SNAPSHOT.jar,name=MyBean,service=EJB3) to KernelDeployment of: my-jar-0.0.1-SNAPSHOT.jar
但是,由于在 META-INF/jboss.xml 上声明了依赖关系,doStuff 方法永远不会执行。我测试了从 META-INF/jboss.xml 中删除依赖项,并且该方法在预定时间执行,但它在两个节点中运行。我的需要是创建一个只在集群的一个节点上运行的计划方法。
更新:如果我在 META-INF/jboss.xml 上这样做:
<session>
<ejb-name>MyBean</ejb-name>
<!-- <depends>jboss.ha:service=HASingletonDeployer,type=Barrier</depends> -->
</session>
计划的方法仍然不在任何节点中运行。
但如果我这样做:
<!-- <session>
<ejb-name>MyBean</ejb-name>
<depends>jboss.ha:service=HASingletonDeployer,type=Barrier</depends>
</session> -->
该方法在两个节点中运行。
任何人都可以帮助我吗?谢谢。