'JobDetailBean'에 해당되는 글 1건

  1. 2009.02.05 [스프링 소스 까보기 ]quartz 스케줄러와 .. 스프링사용하면서..
봄싹2009. 2. 5. 13:46
음...
스프링으로 만들어진 데몬이 있다;;
그러고 ;;

그 데몬과 다르게 ;; 일 배치로 작업을 돌리것이 있어서 ;; quartz를 또다시 한번 사용했다;;

몇달전에 사용했던 기억을 더듬어서 ;; 하는데;;
음.. 처음 막힌건;;
quartz의 jobClass로 등록된 놈에서 스프링 컨테이너에서 살고잇는 빈들을 가져다 쓰고 싶었다;;

처음 시도는 @Autowired 음.. '' ;;
안된다.. 보아 하니;;
<bean id="xxxxx"    class="org.springframework.scheduling.quartz.JobDetailBean"
        p:jobClass="여긴 클랙스가 들어가야 된다;;"/>

대충 보니;; 저놈이 클래스를 가져 가서 그때 그떄 만들어서 쓰던지;; 무튼;; 해당놈이 스프링 컨테이너 생명주기에 들어가는 놈이 아니라는 것이다..

그래서 ;; JobDetailBean.java 소스를 보니~
public class JobDetailBean extends JobDetail
    implements BeanNameAware, ApplicationContextAware, InitializingBean {
    private ApplicationContext applicationContext;
    private String applicationContextJobDataKey;

두놈이 보인다..
음 그리고 ~ JobDetailBean 이놈이 스프링 컨테이너의 생명주기에 들어가고 .. Aware들을 이용해서 ;;
자신에게 ApplicationContext를 가지고 있는것.. ;; 그리고 쭈욱~보니..

if (this.applicationContextJobDataKey != null) {
            if (this.applicationContext == null) {
                throw new IllegalStateException(
                    "JobDetailBean needs to be set up in an ApplicationContext " +
                    "to be able to handle an 'applicationContextJobDataKey'");
            }
            getJobDataMap().put(this.applicationContextJobDataKey, this.application    ApplicationContext ctx;
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        ctx = (ApplicationContext)context.getJobDetail().getJobDataMap().get("applicationContext");
        for(String name : ctx.getBeanDefinitionNames()){
            System.out.println(name);
        }
Context);
        }
대충 이것도 발견~!!
음.. JobDataMap에 applicationContextJobDataKey 이름으로 applicationContext를 넣어주는것;;

오홋 빙고~~~
그래서..
      <bean id="xxxJobDetail"    class="org.springframework.scheduling.quartz.JobDetailBean"
        p:jobClass="org.xxx.xxx.aaaa"
        p:applicationContextJobDataKey="applicationContext">
    </bean>

이라고 설정해서..
    ApplicationContext ctx;
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        ctx = (ApplicationContext)context.getJobDetail().getJobDataMap().get("applicationContext");
        for(String name : ctx.getBeanDefinitionNames()){
            System.out.println(name);
        }

이렇게 찍어보니.~~ 다 나온다~~ 스프링 컨테이너에서 살고 있는 놈들이~ 유후~~~~;;
물론...
      <bean id="xxxJoquartzbDetail"    class="org.springframework.scheduling.quartz.JobDetailBean"
        p:jobClass="xyz.aa">
        <property name="jobDataAsMap">
            <map>
                <entry key="bean key" value-ref="넣고 싶은 bean"/>
            </map>
        </property>
    </bean>

    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
(Xxx)context.getJobDetail().getJobDataMap().get("xxx");
        }

이러게 하여서 빈을 JobDataMap 이라는 놈에게 담아서 꺼내 쓸수도 있다~!!


Posted by is윤군

댓글을 달아 주세요