2012-12-18 89 views
1

我已經創建了EJB 3 Timer,並將其部署到weblogic羣集中。 createTimer參數是createTimer(1000,20000,null); 這應該每20秒創建一個循環計時器。但計時器始終每30秒創建一次。我甚至將intervalDuration更改爲40和50秒,但超時方法始終每30秒觸發一次。ejb輪詢器每隔30秒觸發一次

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

下面是從ACTIVE表中的條目 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

誰能幫我調查爲什麼總是計時器trigge rs每隔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> 

在此先感謝

回答

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 - 如果期滿被延遲(例如,由於其他方法的交織呼籲豆),在靠近繼承可能發生兩個或更多到期通知「跟上來」。

+0

嗨Nayan,感謝您的迴應..我遇到的問題是時間總是觸發在每30秒。在創建時間時給出的intervalDuration完全被忽略了......你能否讓我知道爲什麼intervalDuration沒有被反映出來。我甚至清理了表格並重新部署了時間,但仍然每隔30秒發生一次 –

+0

@EswaramoorthyBabu我根據您的意見刪除了帖子,請參閱編輯部分 –

0

您可以使用不同的樣式(註釋)。見下文:

@Schedule(hour = "*", minute = "*",second = "*/40") 
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    @Lock(LockType.WRITE) 
    @AccessTimeout(1000 * 60 * 60)//1 Hour...//Concurrent Access is not permitted...