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 내에 추가에서
PPS - @UnitOfWork 주석을 사용해 보았지만 도움이되지 않았습니다. – user1795370
제목의 왼쪽에 마우스를 올려 놓으면 GitHub에서 주어진 제목에 하이퍼 링크를 얻을 수 있습니다. 예 : https://github.com/timmolter/XDropWizard#inject-global-objects-or-config-parameters-into-a-job – zloster
'@ UnitOfWork' 정보 : 스케쥴러 메소드에서'Jersey'-scope 밖에 있습니다. . 다음을 수행 했습니까? http://www.dropwizard.io/1.0.5/docs/manual/hibernate.html#transactional-resource-methods-outside-jersey-resources? – zloster