当前位置: 首页 > 知识库问答 >
问题:

Dropwizard使用日晷计划作业无法访问会话

梁丘高朗
2023-03-14

我正在尝试使用dropwizer-日记本来安排工作。在我的预定工作中,我需要访问我的DAO。每当我计划的作业运行时,我都会收到以下错误...

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,它们不是空的,但它们不绑定到任何会话。我该怎么解决这个问题??

(PS,当我通过资源访问Hibernate会话时,它工作正常,只是不是计划的任务)

共有1个答案

阎晔
2023-03-14

在ServiceApplication中,按如下方式实例化您的电子邮件服务,并将其添加到servletContext中。

// 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);
 类似资料:
  • 我对Hazelcast很陌生,很可能我错过了一些显而易见的东西,但这里要说。我有一个运行分布式的Java应用程序,每个应用程序都包含自己的Hazelcast实例。我需要Hazelcast调度一个作业,它将以固定的速率运行,但绝不会同时在几个实例上运行。为此,我计划使用IScheduledExecutorService并创建一个实现Runnable和NamedTask的作业。我的问题是作业需要在应用

  • 问题内容: 我有一个必须执行重复任务的Web应用程序,发送消息和警报,我已经使用脚本页面在浏览器中加载它们时执行了这些任务,即http://example.com/tasks.php,我已经在我的Web应用程序的每个页面中都使用iframe表示。 现在,我想将其更改为使用CRON作业,因为第一种方法可能会导致卡纸性能,因此,我如何制作访问http://example.com/tasks.php的C

  • Spring使用Quartz的顺序作业计划 我有三个或更多的工作,这取决于他们各自以前的工作,他们将按顺序运行。如果完成运行,当完成运行。如果在上一个中发生任何错误,则不会激发下一个触发的作业。我试图了解工作链使用石英,但无法通过它。 作业顺序如下所示 提前谢了。

  • 我想建立一个单一的Spring Boot应用程序,同时做多种不同的任务。我在互联网上做了研究,但我找不到任何出路。我来详细说说。我希望每隔一段时间启动一次作业,例如一天一次。我可以用Spring石英来做。我也想在一个专用的互联网地址上听信息。消息将来自Apache Kafka平台。因此,我想将Kafka集成用于Spring框架。它实际上是否适用(始终监听消息并按时执行计划的作业)

  • 我想对詹金斯的工作进行声纳分析。我在用蚂蚁,所以我在用声纳跑步者和声纳。项目中的属性。我正在将二进制文件配置为 sonar.binaries=构建/蚂蚁/类 成功构建后,声纳开始运行一段时间。但是我在字节码分析中得到很多警告。 我收到警告XX-无法通过类加载器访问类“XX”。 每堂课... 我真的不知道为什么都有课?

  • 我需要两个 cron 工作,我真的不确定我做得是否正确。一个骗局作业应该在每 01.01.xxx 01:00 运行一次,另一个应该在每晚 01:00 运行。 这是正确的表达吗?