Планирование заданий WebLogic

Я пытаюсь реализовать пример планирования заданий WebLogic, чтобы протестировать возможности кластера для переключения при отказе в запланированных задачах (чтобы убедиться, что эти задачи выполняются в сценарии переключения при отказе).

Имея это в виду, я следовал этому примеру и пытался настроить все соответственно. Вот шаги, которые я сделал до сих пор:

  1. Настроил кластер с 1 сервером администрирования (AdminServer) и 2 управляемыми экземплярами (Noddy и Snoopy);
  2. Настройте таблицы базы данных (используя Oracle XE): ACTIVE и WEBLOGIC_TIMERS;
  3. Настройте источник данных для доступа к БД и свяжите его с задачами планирования в разделе «Настройки для кластера»> «Планирование»;
  4. Реализовано задание (TimerListener) и сервлет для инициализации планирования заданий, как показано ниже:

.

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() ) );
        }
    }

}

Затем я выполнил сервлет, чтобы начать планирование на первом управляемом экземпляре (сервер Noddy), который вернул ожидаемый результат:

(вывод выполнения сервлета)

service () вводит блок try для инициализации таймера из JNDI

Справочник по jobScheduler weblogic.scheduler.TimerServiceImpl@43b4c7

Таймер запланирован!

service () запустил таймер

Запустил таймер - статус:

В результате в моих таблицах БД было создано 2 строки:

  • WEBLOGIC_TIMERS состояние таблицы после выполнения сервлета:

    "РЕДАКТИРОВАТЬ"; «TIMER_ID»; «СЛУШАТЕЛЬ»; "НАЧАЛЬНОЕ ВРЕМЯ"; «ИНТЕРВАЛ»; "TIMER_MANAGER_NAME"; "ДОМЕННОЕ ИМЯ"; "CLUSTER_NAME";

    ""; "Noddy_1268653040156"; "[тип данных]"; «1268653040156»; «30000»; "weblogic.JobScheduler"; "myCluster"; «Кластер»

  • ACTIVE состояние таблицы после выполнения сервлета:

    "РЕДАКТИРОВАТЬ"; «СЕРВЕР»; "ПРИМЕР"; "ДОМЕННОЕ ИМЯ"; «ИМЯ КЛАСТЕРА»; «ТАЙМ-АУТ»;

    ""; "service.SINGLETON_MASTER"; «6382071947583985002 / Noddy»; «QRENcluster»; «Кластер»; «10.03.15»

Хотя задание не выполняется по расписанию. Он должен напечатать сообщение в выводе журнала сервера (файл Noddy.out) с отметкой времени, говорящее, что таймер истек. Это не так. В моих файлах журнала указано следующее:

Сервер администратора журнал (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 (Noddy.out файл):

service() entering try block to intialize the timer from JNDI
jobScheduler reference weblogic.scheduler.TimerServiceImpl@43b4c7
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 timedexecution.TimerServlet$ExampleTimerListener@2ce79a> 
####<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.> 

Может ли кто-нибудь помочь мне выяснить, что не так с моей конфигурацией? Заранее спасибо за помощь!


person XpiritO    schedule 15.03.2010    source источник
comment
Снупи тоже работает в это время? Вы пробовали запустить сервлет из Snoopy - просто мысль   -  person JoseK    schedule 15.03.2010
comment
Пробовал, но ничего не меняло. Я попытался перезагрузить машину (на которой размещен кластер дыр, так как это локальная конфигурация на виртуальной машине), и все, что у меня было, это разница в LOG Noddy (файл Noddy.log): «#### ‹15 / Mar / 2010 14H53m GMT› ‹Info› ‹Cluster› ‹test-ad› ‹Noddy› ‹[АКТИВНЫЙ] ExecuteThread: '2' для очереди: 'weblogic.kernel.Default (самонастройка)'› ‹ Ядро WLS ›› ‹› ‹› ‹1268664789340› ‹BEA-000189› ‹Теперь на этом сервере активен Singleton Service TimerMaster.› »   -  person XpiritO    schedule 15.03.2010
comment
Я вижу, что у вас тоже нет ответа на форуме Oracle. но разве этот TimerMaster службы Singleton теперь активен на этом сервере сообщение об успешном выполнении из предыдущего?   -  person JoseK    schedule 18.03.2010
comment
@josek Я так не думаю, потому что я выключил все серверы (административные и управляемые), а затем удалил файлы журналов. Эти сообщения регистрируются после перезапуска кластера.   -  person XpiritO    schedule 18.03.2010


Ответы (2)


Я решил решить эту проблему, перезапустив всю систему, а затем запустив экземпляры WebLogic из командной строки. В этой перспективе мне удалось заставить это работать, с выводом в командную строку.

Я хотел бы поблагодарить всех, кто пытался помочь мне решить эту проблему.

person XpiritO    schedule 22.03.2010

Также попробуйте добавить отладку (JAVA_OPTIONS: -Dweblogic.debug.DebugSingletonServices = true -Dweblogic.JobScheduler = true)

Для меня было недостаточно просто поставить его в параметрах запуска сервера через Консоль. Пришлось вставить setDomainEnv.sh.

person Radek Skokan    schedule 20.04.2011