2013-06-03 2 views
2

이 답변을 둘러 보았지만 좋은 대답을 찾을 수 없었습니다. 사람들이 자신의 작업을 계획 할 수있게 해주는 Quartz 기반의 시스템을 만들고 싶습니다. 나는 의사적인 예를 사용할 것이다.비행 중에 석영 소스 Java 파일 추가

  1. 내 Quartz 프로그램의 주요 방법은 quartz.java라고 가정 해 보겠습니다.
  2. 그런 다음 석기 "작업"인터페이스를 구현하는 sweep.java라는 파일이 있습니다.

그래서 내 quartz.java에서 sweep.java가 매 시간마다 실행되도록 예약합니다. 나는 quartz.java를 실행하고 잘 동작한다. 큰; 그러나 이제 석영 스케쥴러에 dust.java를 추가하려고합니다. 그러나 이것은 프로덕션 서비스이므로 quartz.java 파일을 중지하고 내 dust.java를 추가하고 quartz.java를 다시 컴파일하고 실행하지 않아도됩니다. 이 가동 중지 시간은 용납 될 수 없습니다.

아무도 내가 이것을 수행 할 수있는 방법에 대한 아이디어가 있습니까? 불가능한 것 같습니다. 어떻게 재 컴파일, 링크 등을하지 않고도 다른 자바 파일을 프로그램에 공급할 수 있었기 때문입니다.

이 예제가 확실해지기를 바랍니다. 어떤 부분을 명확히해야하는지 알려주세요.

+0

, 당신은 적어도 썬/오라클의 JDK를 사용하여 컴파일 된 클래스를 즉석에서 자바 파일을 컴파일하고 인스턴스화 할 수 있습니다. – fge

답변

0

부분적인 대답 : 프로그래밍 방식으로 클래스를 컴파일하고 인스턴스화 할 수 있습니다.

여기서 코드 예에 대한 링크 :

추출 된 클래스는 Class<?> 개체를 반환하는 getGeneratedClass 메서드를 참조하십시오.

매우 : 위험 할 수 있습니다. 신중하지 않으면 심각한 문제가 될 수있는 한 가지 문제는 클래스를 동적으로 인스턴스화 할 때 정적 초기화 블록이으로 실행된다는 것입니다. 그리고 이것들은 잠재적으로 응용 프로그램에 혼란을 야기 할 수 있습니다. 따라서 적절한 SecurityContext을 만들어야합니다.

위의 코드에서 실제로는 Class<?> 개체 만 가져오고 어떤 식으로도 인스턴스화하지 않으므로 코드가 실행되지 않습니다. 그러나 사용 시나리오는 매우 다릅니다.

+0

Quartz의 일반적인 유스 케이스가 아닌가? 이 일을 올바르게 처리해야하는 것처럼 보입니다. 내 말은, 사람들이 끊임없이 그들의 프로그램을 다시 할 수 있다고 기대할 수는없는 것입니까? 내가 놓친 게 있니? 안녕하세요, 빠른 제안에 감사드립니다! –

+0

Quartz로 동적 작업 생성을하는 일반적인 사용 예는 다양한 "준비된"작업을 사용자에게 제안하는 것입니다. 적어도 지금까지 내가 보았던 것입니다 ... 저는 석영 전문가가 아니므로 실제로 제 제안보다 더 우아한 해결책이있을 것입니다. – fge

0

나는 이들 중 아무 것도 시도하지 않았지만 시도해 볼 가치가 있습니다.

1) Quartz camel endpoint을 사용해보십시오. 아파치 낙타는 나의 이해가 옳다면 즉시 낙타 루트를 만들 수 있습니다. 필요한 클래스가 이미 컨테이너의 클래스 경로에서 사용 가능할 것이라는 점을 고려하여 camel-context.xml을 컨테이너에 배치하기 만하면됩니다.

2) Quartz를 사용하면 작업 및 트리거의 xml 구성으로 선언적으로 작업을 만들 수 있습니다. 자세한 내용은 here을 참조하십시오.

3) 지금 이것은 어떤 노력 ;-)

당신이 작업의 일환으로 실행하는 방법이있는 인터페이스를 작성해야합니다. 이 메서드는

public interface MyDynamicJob 
{ 
    public void executeThisAsPartOfJob(); 
} 

이라는 메서드가 있습니다. 작업 메서드의 인스턴스를 만듭니다.

public EmailJob implements MyDynamicJob 
{ 
    @Override 
    public void executeThisAsPartOfJob() 
    { 
     System.out.println("Sending Email"); 
    } 
} 

이제 메인 스케줄러 엔진에서 Observer 패턴을 사용하여 작업을 동적으로 저장/초기화하십시오. 뭔가 같은 사실

HashMap jobs=new HashMap<String,MyDynamicJob>(); 

// call this method to add the job dynamically. 
// If you add a job after the scheduler engine started , find a way here how to  reiterate over this map without shutting down the scheduler :-). 
public void addJob(String someJobName,MyDynamicJob job) 
{ 
    jobs.add(someJobName,job); 
} 

public void initiateScheduler() 
{ 
    // Iterate over the jobs map to get all registered jobs. Create 
    // Create JobDetail instances dynamically for each job Entry. add your custom job  class as a part of job data map. 

     Job jd1=JobBuilder.newJob(GenericJob.class) 
       .withIdentity("FirstJob", "First Group").build(); 

     Map jobDataMap=jd1.getJobDataMap(); 
     jobDataMap.put("dynamicjob", jobs.get("dynamicjob1")); 


} 

public class GenericJob implements Job { 

    public void execute(JobExecutionContext arg0) throws JobExecutionException { 
     System.out.println("Executing job"); 

     Map jdm=arg0.getJobDetail().getJobDataMap(); 
     MyDynamicJob mdj=jdm.get("dynamicjob"); 
     // Now execute your custom job method here. 
     mdj.executeThisAsPartOfJob(); 
     System.out.println("Job Execution complete"); 
    } 

}  
관련 문제