2015-09-14 22 views
9

Tôi có ứng dụng Play 2.4. Cố gắng khởi động tác vụ hàng tuần khi ứng dụng bắt đầu. Đề xuất hiện tại là làm điều đó trong một hàm tạo cho một lớp được háo hức tiêm (Guice). Tuy nhiên, nhiệm vụ của tôi cần truy cập vào một dịch vụ. Làm thế nào tôi có thể tiêm dịch vụ đó vào công việc của mình mà không gặp lỗi:Gọi dịch vụ khi khởi động trong ứng dụng Play

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

?

+2

Bạn có nghĩa là Play 2.4? – Kris

+0

Bạn có một số mã nguồn không? – Kris

Trả lời

4

Bạn cần phải sử dụng phép xây dựng trong lớp ApplicationStart của bạn và cung cấp một ApplicationModule để ràng buộc nó háo hức.

Trong application.conf của bạn:

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

Trong AppModule Lớp của bạn:

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(); 

    } 
} 

Trong lớp ApplicationStart của bạn:

@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 

    } 
} 

Trong trường hợp bạn cần đến nó; ApplicationStop:

@Singleton 
public class ApplicationStop { 

    @Inject 
    public ApplicationStop(ApplicationLifecycle lifecycle) { 

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

    } 
} 
+0

Thực ra tôi sử dụng nó trong ứng dụng của mình, tôi vừa xóa các chi tiết triển khai cụ thể. Nó hoạt động, bạn có thể thử. – SerhatCan

Các vấn đề liên quan