1

我创建了 EJB 3 Timer 并将其部署到 weblogic 集群中。createTimer 参数为 createTimer(1000, 20000, null); 这应该每 20 秒创建一次重复计时器。但是计时器总是每 30 秒创建一次。我什至将 intervalDuration 更改为 40 和 50 秒,但超时方法总是每 30 秒触发一次。

以下是 WEBLOGIC_TIMERS 表中的条目 1@@OSBNode2_1355845459844 (BLOB) 1355846770914 1000 TimerearTimerTest.jarTimerTest OSBDomain OSBCluster

Below are the entry from ACTIVE table timer.1@@OSBNode2_1355843156331 -96726833478167425/OSBNode2 OSBDomain OSBCluster 18-DEC-12 service.TimerMaster 8866906753834651127/OSBNode1 OSBDomain OSBCluster 18-DEC-12 service.SINGLETON_MASTER 8866906753834651127/OSBNode1 OSBDomain OSBCluster 18-DEC-12

谁能帮我调查为什么计时器总是每 30 秒触发一次而不是我的 intervalDuration 值?

下面是 EJB ----->>

    package com.timertest;
import java.util.*;
import javax.annotation.Resource;
import javax.ejb.*;

@Stateless(mappedName = "TimerTest")
public class TimerTest implements TimerTestRemote
{
    @Resource
    private SessionContext ctx;

  @Override
  public void createMyTimer()
    throws EJBException
  {
        ctx.getTimerService().createTimer(1000, 20000, null);
  }

    @Timeout
    public void timeout(Timer timer) 
    {
        System.out.println("-> Timed Out ..."+ new Date());

    }
}


Below is the and weblogic descripor-------->>
    <?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-ejb-jar
    xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-ejb-jar"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-ejb-jar http://xmlns.oracle.com/weblogic/weblogic-ejb-jar/1.2/weblogic-ejb-jar.xsd">
    <wls:weblogic-enterprise-bean>
        <wls:ejb-name>TimerTest</wls:ejb-name>
        <wls:stateless-session-descriptor>

            <wls:stateless-clustering>
                <wls:home-is-clusterable>true</wls:home-is-clusterable>
                <wls:home-load-algorithm>round-robin</wls:home-load-algorithm>
                <wls:stateless-bean-is-clusterable>true</wls:stateless-bean-is-clusterable>
                <wls:stateless-bean-load-algorithm>round-robin
                </wls:stateless-bean-load-algorithm>
            </wls:stateless-clustering>
            <wls:business-interface-jndi-name-map>
                <wls:business-remote>TimerTestRemote</wls:business-remote>
                <wls:jndi-name>TimerTest</wls:jndi-name>
            </wls:business-interface-jndi-name-map>
        </wls:stateless-session-descriptor>
        <wls:enable-call-by-reference>false</wls:enable-call-by-reference>
        <wls:jndi-name>TimerTest</wls:jndi-name>
    </wls:weblogic-enterprise-bean>
    <wls:timer-implementation>Clustered</wls:timer-implementation>
</wls:weblogic-ejb-jar>

提前致谢

4

2 回答 2

0

您可以使用不同的样式(注释)。见下文:

    @Schedule(hour = "*", minute = "*",second = "*/40")
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    @Lock(LockType.WRITE)
    @AccessTimeout(1000 * 60 * 60)//1 Hour...//Concurrent Access is not permitted...
于 2013-02-21T18:43:15.017 回答
0

这可能不是直接的答案,但可能有助于避免这种情况。


默认情况下,计时器是持久的,因此您必须在启动新计时器之前取消以前的计时器。

此外,您可以info在创建计时器对象时提供而不是传递null, 可能是字符串标识符。稍后它将有助于识别哪个计时器已超时或在系统中有多个计时器的情况下取消它。

创建计时器并多次重新启动应用程序,有几个这样的计时器具有相同info的 ,但具有不同的hashCode。因此它们不会重叠并且每次都会创建新的。

ctx.getTimerService().getTimers()您可以通过迭代来获取计时器并取消它们。

编辑:我已经复制了场景并遇到了类似的问题。我已经调试过,当有多个先前的计时器在同一时间间隔内处于活动状态时,就会发生这种情况,而这些计时器没有被取消。

你试试下面的代码,我试过了,它解决了这个问题。

for(Timer t : timerService.getTimers())
    t.cancel();  //-- Cancel timers before creatimng new one
ctx.getTimerService().createTimer(1000, 20000, null);

文档摘录:

intervalDuration - 如果过期被延迟(例如,由于 bean 上的其他方法调用的交错),两个或多个过期通知可能会连续发生以“赶上”。

于 2012-12-19T10:30:33.510 回答