在weblogic(10.x)2节点群集环境中遇到EJB 3.0 Timer问题。 时间应该每隔1分钟(预配置)触发或超时,仅来自群集的一个节点。
但是当计时器部署在2节点集群中时,它不会从任何节点触发。
遵循的步骤:
1)使用配置了计时器的无状态会话bean创建了一个EJB 3.0项目。 创建一个loadonstartup设置为1的servlet,它触发EJB createTimer方法。 启用集群EJB计时器服务,将weblogic-ejb-jar.xml中的timer-implementation元素设置为clustered
<timer-implementation>Clustered</timer-implementation>
2)HA数据库指向Oracle Db,其中创建了WEBLOGIC_TIMERS和ACTIVE表。
3)使用config.xml文件中的元素映射到HA数据库的JDBC数据源。
4)使用config.xml中的元素租用JDBC数据源定义的服务。
weblogic-ejb-jar.xml描述符文件:
<weblogic-ejb-jar>
<weblogic-enterprise-bean>
<ejb-name>ClusteredSessionEJB</ejb-name>
<stateless-session-descriptor>
<pool>
<max-beans-in-free-pool>1</max-beans-in-free-pool>
<initial-beans-in-free-pool>1</initial-beans-in-free-pool>
</pool>
<stateless-clustering>
<home-is-clusterable>true</home-is-clusterable>
<home-load-algorithm>round-robin</home-load-algorithm>
<stateless-bean-is-clusterable>true</stateless-bean-is-clusterable>
<stateless-bean-load-algorithm>round-robin</stateless-bean-load-algorithm>
</stateless-clustering>
</stateless-session-descriptor>
</weblogic-enterprise-bean>
<timer-implementation>Clustered</timer-implementation>
</weblogic-ejb-jar>
EJB代码:
@Stateless(name = "ClusteredSessionEJB", mappedName = "TimerClusterApp-Model- ClusteredSessionEJB")
public class ClusteredSessionEJBBean implements ClusteredSessionEJB {
@Resource
TimerService mdsCacheUpdateTimer;
@Timeout
public void scheduleJob(final Timer timerObj) {
LOGGER.info("scheduleJob fired in ClusteredSessionEJBBean");
}
public void createTimer() {
LOGGER.setLevel(Level.INFO);
LOGGER.info("creating timer in ClusteredSessionEJBBean");
mdsCacheUpdateTimer.createTimer(60000, 60000, "ClusteredSessionEJBBean-Timer");
}
}