2010-03-15 120 views
1

我試圖實現一個WebLogic作業調度示例,以測試我的集羣在計劃任務上的故障切換功能(以確保這些任務在故障切換方案上執行)。WebLogic作業調度

考慮到這一點,我一直在關注this example並試圖相應地配置一切。下面是我到目前爲止已經完成的步驟:

  1. 配置集羣1個管理員 服務器(AdminServer中)和2個管理的 實例(諾迪史努比);
  2. 設置數據庫表(使用Oracle XE):ACTIVEWEBLOGIC_TIMERS;
  3. 設置訪問數據庫的數據源,並將 與調度 任務相關聯的任務在「設置羣集」> 「調度」下執行。
  4. 實施的作業(TimerListener) 和的servlet初始化作業 調度,如下:

package timedexecution; 

import java.io.IOException; 
import java.io.PrintWriter; 
import java.io.Serializable; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import commonj.timers.Timer; 
import commonj.timers.TimerListener; 
import commonj.timers.TimerManager; 

public class TimerServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    protected static void logMessage(String message, PrintWriter out){ 
     out.write("<p>"+ message +"</p>"); 
     System.out.println(message); 
    } 

    @Override 
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     PrintWriter out = response.getWriter(); 
     // 
     out.println("<html>"); 
     out.println("<head><title>TimerServlet</title></head>"); 
     // 
     try { 
      // 
      logMessage("service() entering try block to intialize the timer from JNDI", out); 
      // 
      InitialContext ic = new InitialContext(); 
      TimerManager jobScheduler = (TimerManager)ic.lookup("weblogic.JobScheduler"); 
      // 
      logMessage("jobScheduler reference " + jobScheduler, out); 
      // 
      jobScheduler.schedule(new ExampleTimerListener(), 0, 30*1000);    
      // 
      logMessage("Timer scheduled!", out); 
      // 
      //execute this job every 30 seconds 
      logMessage("service() started the timer", out); 
      // 
      logMessage("Started the timer - status:", out); 
      // 
     } 
     catch (NamingException ne) { 
      String msg = ne.getMessage(); 
      logMessage("Timer schedule failed!", out); 
      logMessage(msg, out); 
     } 
     catch (Throwable t) { 
      logMessage("service() error initializing timer manager with JNDI name weblogic.JobScheduler " + t,out); 
     } 
     // 
     out.println("</body></html>"); 
     out.close(); 
    } 


    private static class ExampleTimerListener implements Serializable, TimerListener { 
     private static final long serialVersionUID = 8313912206357147939L; 

     public void timerExpired(Timer timer) { 
      SimpleDateFormat sdf = new SimpleDateFormat(); 
      System.out.println("timerExpired() called at " + sdf.format(new Date())); 
     } 
    } 

} 

然後我執行小服務程序啓動所述第一被管理的實例調度(諾迪服務器),其返回作爲預期:

(Servlet的執行輸出

服務()輸入try block到 初始化JNDI的計時器

jobScheduler參考 [email protected]

定時器預定!

服務()啓動定時器

啓動的計時器 - 狀態:

這導致我的數據庫表創建的2行:

  • WEBLOGIC_TIMERS表狀態後, servlet執行:

    「編輯」; 「TIMER_ID」; 「監聽器」; 「開始時間」; 「間隔」; 「TIMER_MANAGER_NAME」; 「DOMAIN_NAME」; 「CLUSTER_NAME」;

    「」; 「Noddy_1268653040156」; 「[數據類型]」; 「1268653040156」; 「30000」; 「weblogic的。的jobscheduler「; 」myCluster中「; 」集羣「 的servlet執行後

  • ACTIVE表狀態:

    」EDIT「, 」服務器「, 」INSTANCE「; 」DOMAINNAME「; 」CLUSTERNAME「; 」超時「;

    「」; 「service.SINGLETON_MASTER」; 「6382071947583985002 /諾迪」, 「QRENcluster」; 「集羣」; 「15年3月10日」

雖然沒有如期執行作業它應該在服務器的日誌輸出(Noddy.out文件)w上打印一條消息ith一個時間戳,說定時器已經過期。它沒有。我的日誌文件狀態如下:

管理服務器日誌(myCluster.log文件):

####<15/Mar/2010 10H45m GMT> <Warning> <Cluster> <test-ad> <Noddy> <[STANDBY] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1268649925727> <BEA-000192> <No currently living server was found that could host TimerMaster. The server will retry in a few seconds.> 

諾迪服務器日誌 (Noddy.out文件):

service() entering try block to intialize the timer from JNDI 
jobScheduler reference [email protected] 
Timer scheduled! 
service() started the timer 
Started the timer - status: 
<15/Mar/2010 10H45m GMT> <Warning> <Cluster> <BEA-000192> <No currently living server was found that could host TimerMaster. The server will retry in a few seconds.> 

Noddy.log文件) :

####<15/Mar/2010 11H24m GMT> <Info> <Common> <test-ad> <Noddy> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1268652270128> <BEA-000628> <Created "1" resources for pool "TxDataSourceOracle", out of which "1" are available and "0" are unavailable.> 
####<15/Mar/2010 11H37m GMT> <Info> <Cluster> <test-ad> <Noddy> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<anonymous>> <> <> <1268653040226> <BEA-000182> <Job Scheduler created a job with ID Noddy_1268653040156 for TimerListener with description [email protected]> 
####<15/Mar/2010 11H39m GMT> <Info> <JDBC> <test-ad> <Noddy> <[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1268653166307> <BEA-001128> <Connection for pool "TxDataSourceOracle" closed.> 

任何人都可以幫助我發現我的配置有什麼問題嗎?在此先感謝您的幫助!

+0

史努比此時是否也在運行?你嘗試過從Snoopy發射servlet - 只是想到了 – JoseK 2010-03-15 13:39:31

+0

試過了,但它沒有改變任何東西。我嘗試重新啓動機器(主機羣集,因爲它是虛擬機上的本地配置),我得到的只是Noddy的LOG(「Noddy.log」文件)上的差異:«## ## <15/Mar/2010 14H53m GMT><[ACTIVE] ExecuteThread:'2'for queue:'weblogic.kernel.Default(self-tuning)'><><><><1268664789340>» – XpiritO 2010-03-15 14:56:08

+0

我可以看到你在Oracle論壇上也沒有回覆。但不是這個「Singleton服務TimerMaster現在在這個服務器上活躍」來自早期的成功信息? – JoseK 2010-03-18 12:53:49

回答

1

我原來是通過重新啓動整個系統然後從命令行啓動WebLogic實例來解決這個問題。在這個角度來看,我設法讓這個工作,輸出被髮送到命令行。

我想感謝所有試圖幫助我解決這個問題的人。

0

也嘗試添加調試(JAVA_OPTIONS:-Dweblogic.debug.DebugSingletonServices =真-Dweblogic.JobScheduler =真)

對於我來說,這是不夠的,把它只是通過控制檯服務器啓動PARAMS 。我不得不放入setDomainEnv.sh。

0

您還可以使用哈德遜軟件開發週期中的JAVA作業調度的完整解決方案。更多信息是在這裏:

http://en.wikipedia.org/wiki/Hudson_(software)

它有很多的選擇,很容易使用。我們將它用於每個環境。