2015-02-05 36 views
0

我們正在嘗試使用ejb 3.1定時器組件。EJB 3.1自動定時器(@schedule)無法識別oracle定時表

我們的需求非常簡單。每分鐘調用一次java類中的方法。 爲使該組件的工作:

  1. 了WebSphere了創建
    Oracle數據庫的EJB計時器表我已經執行了DDL。
    表在EJBTIMER表空間中創建

  2. 這裏是我的Java無狀態Bean代碼 @Schedule(分鐘= 「/1」,小時= 「」,執着= TRUE) 公共無效executeTimer(){ //此處的業務邏輯 }

  3. 持久性爲真,ejb正在嘗試查找已創建的表,但其 以下面的異常結束。

例外:

[2/5/15 15:06:40:605 EST] 00000000 ContainerHelp E WSVR0501E: Error creating component [email protected] 
com.ibm.ws.exception.RuntimeWarning: Error while processing references for EJB-in-WAR: com.ibm.ejs.container.ContainerException: EJB Timer Service not available for TimedObject EJB: com.ford.doesbatch.inbound.scheduler.DoesBatchScheduler 
    at com.ibm.ws.runtime.component.EJBContainerImpl.createNestedModuleMetaData(EJBContainerImpl.java:3434) 
    at com.ibm.ws.runtime.component.EJBContainerImpl.createNestedModuleMetaData(EJBContainerImpl.java:726) 
    at com.ibm.ws.runtime.component.MetaDataMgrImpl.createNestedModuleMetaData(MetaDataMgrImpl.java:564) 
    at com.ibm.ws.runtime.component.DeployedModuleImpl.start(DeployedModuleImpl.java:633) 
    at com.ibm.ws.runtime.component.DeployedApplicationImpl.start(DeployedApplicationImpl.java:967) 
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:769) 
    at com.ibm.ws.runtime.component.ApplicationMgrImpl$5.run(ApplicationMgrImpl.java:2160) 
    at com.ibm.ws.security.auth.ContextManagerImpl.runAs(ContextManagerImpl.java:5468) 
    at com.ibm.ws.security.auth.ContextManagerImpl.runAsSystem(ContextManagerImpl.java:5594) 
    at com.ibm.ws.security.core.SecurityContext.runAsSystem(SecurityContext.java:255) 
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:2165) 
    at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:446) 
    at com.ibm.ws.runtime.component.CompositionUnitImpl.start(CompositionUnitImpl.java:123) 
    at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:389) 
    at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.access$500(CompositionUnitMgrImpl.java:117) 
    at com.ibm.ws.runtime.component.CompositionUnitMgrImpl$CUInitializer.run(CompositionUnitMgrImpl.java:995) 
    at com.ibm.wsspi.runtime.component.WsComponentImpl$_AsynchInitializer.run(WsComponentImpl.java:496) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1700) 
Caused by: com.ibm.ejs.container.ContainerException: EJB Timer Service not available for TimedObject EJB: com.ford.doesbatch.inbound.scheduler.DoesBatchScheduler 
    at com.ibm.ws.runtime.component.WASEJBRuntimeImpl.setupTimers(WASEJBRuntimeImpl.java:527) 
    at com.ibm.ws.metadata.ejb.EJBMDOrchestrator.processAutomaticTimerMetaData(EJBMDOrchestrator.java:6347) 
    at com.ibm.ws.metadata.ejb.EJBMDOrchestrator.finishBMDInitForReferenceContext(EJBMDOrchestrator.java:8379) 
    at com.ibm.ws.ejbcontainer.runtime.AbstractEJBRuntime.finishBMDInitForReferenceContext(AbstractEJBRuntime.java:2572) 
    at com.ibm.ws.runtime.component.EJBContainerImpl.createNestedModuleMetaData(EJBContainerImpl.java:3427) 
    ... 17 more 

問:

EJB是無法查找EJBTIMER表空間。無論如何,我們可以在application.py或IBM webconsole中設置它。

回答

0

位分析後,我認爲,如果你@Schedule註釋說:恆心爲「真」,那麼它會尋找EJB表前綴,這是我們在application.py提的webpshere 8

解決方案:

在我的情況下,所有的ejb表都是在名爲EJBTimer的表空間下創建的。顯然,這個表空間沒有分配空間。

得知的教訓是,表佈局應該按給定的方式執行,而不要忘記爲新表空間分配空間。

以下是我們如何將我們的ejb表前綴提到websphere。所以,websphere會讀你的application.py並學習你的EJB定時器設置。

EJB_TIMER_SETTINGS=[] 
EJB_TIMER_SETTINGS.append(["datasourceAlias" ,"xxxx/ejbTimerJDBC"]) 
EJB_TIMER_SETTINGS.append(["datasourceJNDIName" ,"jdbc/xxxx/ejbTimerJDBC"]) 
EJB_TIMER_SETTINGS.append(["tablePrefix" ,"XXXXO13_EJBTIMER_"]) 
EJB_TIMER_SETTINGS.append(["numAlarmThreads" ,"2"]) 
EJB_TIMER_SETTINGS.append(["pollInterval", 60]) 
相關問題