2016-12-08 1 views
0

작업을 예약하기 위해 dropwizard-sundial을 사용하려고합니다. 예약 된 작업에서 DAO에 액세스해야합니다. 내 예약 된 작업이 실행될 때마다 나는 다음과 같은 오류가 발생합니다 ..Dropwizard Schedule Sundial의 작업이 세션에 액세스 할 수 없습니다.

org.hibernate.HibernateException: No session currently bound to execution context 

나는 작업

에 섹션에서 를 주입 글로벌 개체 또는 구성 매개 변수를 링크, https://github.com/timmolter/XDropWizard에 기술 된 방법을 사용하는 것을 시도하고있다 이것은 내 응용 프로그램 코드 :

public class ServiceApplication extends Application<OnboardingServiceConfiguration> { 

    public static final Logger logger = LoggerFactory.getLogger(OnboardingServiceApplication.class); 

    public static void main(String[] args) throws Exception { 
     new OnboardingServiceApplication().run(args); 
    } 

    private final HibernateBundle<OnboardingServiceConfiguration> hibernate = new HibernateBundle<OnboardingServiceConfiguration>(com.rm.models.Application.class, EmailQueue.class) { 
     @Override 
     public DataSourceFactory getDataSourceFactory(OnboardingServiceConfiguration configuration) { 
      return configuration.getDataSourceFactory(); 
     } 
    }; 

    @Override 
    public String getName() { 
     return "onboarding"; 
    } 

    @Override 
    public void initialize(Bootstrap<OnboardingServiceConfiguration> bootstrap) { 
     // add scheduled jobs 
     bootstrap.addBundle(new SundialBundle<OnboardingServiceConfiguration>(){ 
      @Override 
      public SundialConfiguration getSundialConfiguration(OnboardingServiceConfiguration configuration) { 
       return configuration.getSundialConfiguration(); 
      } 
     }); 
     // to the database 
     bootstrap.addBundle(hibernate); 
    } 

    @Override 
    public void run(OnboardingServiceConfiguration configuration, Environment environment) throws Exception { 
     // add health checks 
     final HealthCheckResource resource = new HealthCheckResource(
       environment.healthChecks() 
     ); 
     environment.jersey().register(resource); 

     // configure DAOs for database management 
     final ApplicationDAO applicationDAO = new ApplicationDAO(hibernate.getSessionFactory()); 
     final EmailDAO emailDAO = new EmailDAO(hibernate.getSessionFactory()); 


     logger.info("Package set for scheduled jobs: " + configuration.getSundialConfiguration().getAnnotatedJobsPackageName()); 
     environment.getApplicationContext().setAttribute("EmailDAO", emailDAO); 
     environment.getApplicationContext().setAttribute("ApplicationDAO", applicationDAO); 

     // add resources for REST API endpoints 
     environment.jersey().register(new ApplicationResource()); 

     // setup environment to run scheduled jobs 
     // more info and tutorial found at https://github.com/timmolter/dropwizard-sundial 
     environment.admin().addTask(new LockSundialSchedulerTask()); 
     environment.admin().addTask(new UnlockSundialSchedulerTask()); 
     environment.admin().addTask(new RemoveJobTriggerTask()); 
     environment.admin().addTask(new AddCronJobTriggerTask()); 
     environment.admin().addTask(new StartJobTask()); 
     environment.admin().addTask(new StopJobTask()); 
     environment.admin().addTask(new RemoveJobTask()); 
     environment.admin().addTask(new AddJobTask()); 
    } 


} 

그리고 이것은 나의 예약 된 작업입니다 :

@Override 
public void doRun() throws JobInterruptException { 
    this.logger = LoggerFactory.getLogger(EmailJobs.class); 

    logger.info("Running Scheduled Tasks:"); 

    this.emailerService = new EmailerService((EmailDAO) SundialJobScheduler.getServletContext().getAttribute("EmailDAO")); 
    this.applicationDAO = (ApplicationDAO) SundialJobScheduler.getServletContext().getAttribute("ApplicationDAO"); 

    List<Application> applications = applicationDAO.getAllForManagerIncompleteReminder(); 
} 

DAO를 받고 있는데 null이 아니지만 모든 세션에 바인딩되어 있지 않습니다. 이 문제를 어떻게 해결합니까 ??

는 ServiceApplication 다음과 같이 emailerService를 인스턴스화하고 ServletContext 내에 추가에서

+0

PPS - @UnitOfWork 주석을 사용해 보았지만 도움이되지 않았습니다. – user1795370

+0

제목의 왼쪽에 마우스를 올려 놓으면 GitHub에서 주어진 제목에 하이퍼 링크를 얻을 수 있습니다. 예 : https://github.com/timmolter/XDropWizard#inject-global-objects-or-config-parameters-into-a-job – zloster

+0

'@ UnitOfWork' 정보 : 스케쥴러 메소드에서'Jersey'-scope 밖에 있습니다. . 다음을 수행 했습니까? http://www.dropwizard.io/1.0.5/docs/manual/hibernate.html#transactional-resource-methods-outside-jersey-resources? – zloster

답변

0

(I 자원을 통해 액세스 할 때 PS는 최대 절전 모드 세션은 그냥 예약 된 작업, 잘 작동).

// configure DAOs for database management 
    final ApplicationDAO applicationDAO = new ApplicationDAO(hibernate.getSessionFactory()); 
    final EmailDAO emailDAO = new EmailDAO(hibernate.getSessionFactory()); 


    Class[] constructorParams = {EmailDAO.class}; 
    Object[] objectsParam = {emailDAO}; 
    EmailerService emailerService = new UnitOfWorkAwareProxyFactory(hibernate) 
       .create(EmailerService.class, constructorParams, objectsParam); 
    environment.getApplicationContext().setAttribute("EMAIL_SERVICE", emailerService); 
관련 문제