Я пытаюсь реализовать пример планирования заданий WebLogic, чтобы протестировать возможности кластера при отказе при выполнении запланированных задач (чтобы убедиться, что эти задачи выполняются в сценарии отработки отказа).
Имея это в виду, я следовал этому примеру и пытался все настроить соответствующим образом. Вот шаги, которые я сделал до сих пор:
- Настроил кластер с 1 администратором
сервер ( AdminServer ) и 2 управляемых
экземпляры ( Нодди и Снупи );
- Настройка таблиц базы данных (с использованием Oracle
XE):
ACTIVE
и WEBLOGIC_TIMERS
;
- Настройка источника данных для доступа к БД и
связал это с расписанием
задачи в разделе «Настройки для кластера»>
"Планирование";
- Выполнено задание (
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
Таймер запланирован!
служба () запустила таймер
Запустил таймер - статус:
Что привело к созданию 2 строк в моих таблицах БД:
WEBLOGIC_TIMERS
состояние таблицы после выполнения сервлета:
"EDIT"; "TIMER_ID"; «СЛУШАТЕЛЬ»; "НАЧАЛЬНОЕ ВРЕМЯ"; «ИНТЕРВАЛ»; "TIMER_MANAGER_NAME"; "ДОМЕННОЕ ИМЯ"; "CLUSTER_NAME";
""; "Noddy_1268653040156"; "[тип данных]"; "1268653040156"; "30000"; "Weblogic.JobScheduler"; "MyCluster"; "Кластер"
ACTIVE
состояние таблицы после выполнения сервлета:
"EDIT"; "SERVER"; "ПРИМЕР"; "ДОМЕННОЕ ИМЯ"; "ClusterName"; "АУТ";
""; "Service.SINGLETON_MASTER"; "6382071947583985002 / Нодди"; "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 Server log
(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
file):
####<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.>
Может кто-нибудь помочь мне выяснить, что не так с моей конфигурацией? Заранее спасибо за помощь!