2011-12-16 4 views
2

gwt 웹 애플리케이션에서 석영 스케쥴러를 사용하고 있습니다. 내 애플리케이션 구조는 아래와 같습니다.석영 스케쥴러가 전쟁 중이 아닌데

나는 두 개의 프로젝트가있다. 하나는 gwt 웹 애플 리케이션 클라이언트 프로젝트 (Ui 부분) & 다른 서버 쪽 호출을위한 자바 프로젝트입니다. (데이터베이스 상호 작용). 클라이언트 프로젝트에서 나는 참고 용으로 서버 프로젝트를 넣었다. 클라이언트에서 전쟁을 만들고 war 폴더에 서버 프로젝트 병을 추가합니다.

이제는 자동 완성 작업을 위해 서버 측 스케줄러를 사용했습니다. 로컬로 (out war없이) 스케줄러가 제대로 작동하면서 사용하고 있습니다.

그러나 jboss 서버에서 전쟁을 실행하는 동안 스케줄러가 실행되고 있지 않습니다.

내 모든 스케줄러 관련 코드와 Quartz.jar은 서버 측에있다. 클라이언트 측 프로젝트에 Quartz에 대한 참조는 없다.이 문제는 무엇인가 ??? 여기

스케줄러

public class QuartzJob implements Job { 

public void execute(JobExecutionContext jobExecutionContext) 
     throws JobExecutionException { 
    JobDataMap map = jobExecutionContext.getJobDetail().getJobDataMap(); 
    ActivityTransactionSettingsMap map2 = (ActivityTransactionSettingsMap) map 
      .get("task"); 

    if (map2.getAutoCompleteDate() != null) { 
     WorkFlowFacade facade = new WorkFlowFacade(); 
     facade.completeAutoCompleteTask(map2); 
     Scheduler scheduler=(Scheduler) map.get("scheduler"); 
     try { 
      scheduler.shutdown(); 
     } catch (SchedulerException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

}

Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 
    scheduler.start(); 
    JobDataMap map2 = new JobDataMap(); 
    map2.put("task", actsMap); 
    map2.put("scheduler", scheduler); 
    JobDetail job = newJob(QuartzJob.class).withIdentity("job"+String.valueOf(actsMap.getId())) 
      .usingJobData(map2).build(); 
    Trigger trigger = newTrigger().withIdentity("trigger"+String.valueOf(actsMap.getId())) 
      .startAt(actsMap.getAutoCompleteDate()).build(); 
    scheduler.scheduleJob(job, trigger); 

내 코드입니다 아니면 내가 클라이언트 측 만에 내 스케줄러 관련 프로젝트를 이동해야합니까? 이 문제를 해결할 방법이 없습니다. 제발 도와주세요

+1

스케줄러는 내가 볼 수있는 한 GWT 코드와 아무 관련이 없습니다. 스케줄러에 대한 트리거는 무엇입니까? –

+0

다음은 트리거입니다. 트리거 트리거 = newTrigger(). withIdentity ("trigger") .startAt (tomaroDate) .build(); –

+1

잘 모르겠다. 다음날부터 지속적으로 실행해야합니까? 이게 니가 필요한거야? –

답변

2

스케줄러를 실행하려면 뭔가 시작해야합니다. 나는 과정이 일어나는 방법을 잘 모르지만, 당신은 서블릿

public class MySchedulerServlet extends GenericServlet { 

private static final long serialVersionUID = 1477091380142883153L; 

/** 
* Constant to represent property for the cron expression. 
*/ 
private static final String CRON_EXPRESSION = "0 0 0 ? * SUN"; 

public void init(ServletConfig servletConfig) throws ServletException { 

    super.init(servletConfig); 

    // The Quartz Scheduler 
    Scheduler scheduler = null; 

    try { 

     // Initiate a Schedule Factory 
     SchedulerFactory schedulerFactory = new StdSchedulerFactory(); 
     // Retrieve a scheduler from schedule factory 
     scheduler = schedulerFactory.getScheduler(); 
     // Initiate JobDetail with job name, job group and 
     // executable job class 
     JobDetail jobDetail = new JobDetail("RetryJob", "RetryGroup", QuartzJob.class); 
     // Initiate CronTrigger with its name and group name 
     CronTrigger cronTrigger = new CronTrigger("cronTrigger", 
       "triggerGroup"); 
     // setup CronExpression 
     CronExpression cexp = new CronExpression(CRON_EXPRESSION); 
     // Assign the CronExpression to CronTrigger 
     cronTrigger.setCronExpression(cexp); 
     // schedule a job with JobDetail and Trigger 
     scheduler.scheduleJob(jobDetail, cronTrigger); 

     // start the scheduler 
     scheduler.start(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

public void service(ServletRequest serveletRequest, 
     ServletResponse servletResponse) throws ServletException, IOException { 

} 

} 

과 시작에 당신의 web.xml 부하 sceduler이 스케줄러를 작성할 수 있습니다. 이것은 나를 위해 작동합니다.

 <servlet> 
    <servlet-name>QuartzInitializer</servlet-name> 
    <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class> 
    <init-param> 
     <param-name>shutdown-on-unload</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <init-param> 
     <param-name>start-scheduler-on-load</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

     <servlet-name>MySchedulerServlet </servlet-name> 
     <servlet-class>com.servlet.MySchedulerServlet </servlet-class> 
    <load-on-startup>2</load-on-startup> 
0

이 경우 스레드를 사용했습니다.

public class AutoCompleteTaskThread extends Thread { 

private ActivityTransactionSettingsMap taskMap; 

public AutoCompleteTaskThread(ActivityTransactionSettingsMap map) { 
    this.taskMap = map; 
} 
@Override 
public void run() { 
    try { 
     new AutoCompleteTaskScheduler().ScheduleJob(taskMap); 
    } catch (Exception e) {   
     e.printStackTrace(); 
    } 
} 

}

으로 아래와 로컬 컴퓨터에서 그것이 작동하지 않는 JBoss 서버에 대한 됐었 노력하고 있습니다.

+0

다시 말하면 누가 스레드의 시작 메서드를 호출하고 있습니까? –

0

저는 AutoCompleteTaskThread 클래스의 인스턴스를 사용하고 이에 대한 start 메소드를 호출했습니다.

private void addAutoCompleteTask(ActivityTransactionSettingsMap newTask) { 
    AutoCompleteTaskThread thread = new AutoCompleteTaskThread(newTask); 
    thread.start(); 
} 

여기에 새 스레드를 시작하려는 새 작업을위한 스레드가 시작되었습니다.