【问题标题】:Calling a service on startup in a Play application在 Play 应用程序中启动时调用服务
【发布时间】:2015-09-14 17:32:11
【问题描述】:

我有一个 Play 2.4 应用程序。尝试在应用程序启动时启动每周任务。当前的建议是在热切注入的类 (Guice) 的构造函数中执行此操作。但是,我的任务需要访问服务。如何在不出错的情况下将该服务注入我的任务:

Error injecting constructor, java.lang.RuntimeException: There is no started application

?

【问题讨论】:

  • 你的意思是玩 2.4 吗?
  • 你有源代码吗?

标签: service playframework dependency-injection guice


【解决方案1】:

您需要在 ApplicationStart 类中使用构造函数注入并提供一个 ApplicationModule 来急切地绑定它。

在您的 application.conf 中:

play.modules.enabled += "yourPath.AppModule"

在您的 AppModule 类中:

public class AppModule extends AbstractModule {

    @Override
    protected void configure() {

        Logger.info("Binding application start");
        bind(ApplicationStart.class).asEagerSingleton();

        Logger.info("Binding application stop");
        bind(ApplicationStop.class).asEagerSingleton();

    }
}

在您的 ApplicationStart 类中:

@Singleton
public class ApplicationStart {

    @Inject
    public ApplicationStart(Environment environment, YourInjectedService yourInjectedService) {

        Logger.info("Application has started");
        if (environment.isTest()) {
            // your code
        }
        else if(
           // your code
        }

        // you can use yourInjectedService here

    }
}

如果您需要它;应用停止:

@Singleton
public class ApplicationStop {

    @Inject
    public ApplicationStop(ApplicationLifecycle lifecycle) {

        lifecycle.addStopHook(() -> {
            Logger.info("Application shutdown...");
            return F.Promise.pure(null);
        });

    }
}

【讨论】:

  • 其实我在我的应用程序中使用它,我只是删除了具体的实现细节。好用,你可以试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 2015-08-18
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多