2011-02-05 25 views
32

Tôi muốn chạy một số mã khi khởi động để lưu trước một số nội dung và cũng muốn bắt đầu Bộ hẹn giờ để lưu lại một số thứ bên ngoài đường dẫn quan trọng của yêu cầu web. Điều này có thể thực hiện được với Khung Chơi và nơi tôi đặt mã này?Tôi nên đặt mã khởi động trong Play Framework ở đâu?

Trả lời

29

Bạn cần tạo công việc khởi động sẽ được thực hiện bằng cách phát lúc khởi động ứng dụng.

@OnApplicationStart 
public class Bootstrap extends Job { 

    public void doJob() { 
     //do stuff 
    }  
} 

Đọc thêm về cách thực hiện việc này trong Play Manual.

25

Trong play framework 2.0 trở lên, sử dụng GlobalSettings, như đoạn mã sau:

import play.*; 

public class Global extends GlobalSettings { 

    @Override 
    public void onStart(Application app) { 
    Logger.info("Application has started"); 
    } 

    @Override 
    public void onStop(Application app) { 
    Logger.info("Application shutdown..."); 
    } 
} 

biết thêm thông tin, hãy đến playframework docs: JavaGlobal

+3

[Phiên bản Scala của tài liệu, cho 2.3.x] (https://www.playframework.com/documentation/2.3.x/ScalaGlobal) – mjswensen

+0

tối đa 2.4 có lẽ, 2.5 sử dụng di với ApplicationLifecycle – Jasonw

+0

Điều này không được chấp nhận trong 2.6.x: https://www.playframework.com/documentation/2.6.x/GlobalSettings – Spen

6

Đừng quên rằng mã thể hiện trong các câu trả lời trên có nằm trong gói cơ sở của ứng dụng (không có thông số gói). (Tôi đang chạy Khung Chơi 2.3.2).

Ngoài ra, mã sẽ không được chạy ở chế độ nhà phát triển cho đến khi yêu cầu HTTP đầu tiên được thực hiện!

Trong trường hợp của tôi mã của tôi là thế này:

import play.*; 
public class Global extends GlobalSettings { 

@Override 
public void onStart(Application app) { 
    String message = "Application has started! LOLADA"; 
    Logger.info(message); 
    System.out.println(message); 
    } 

    @Override 
    public void onStop(Application app) { 
     String message = "Application shutdown...!!! LOLADA"; 
     Logger.info(message); 
     System.out.println(message); 
    } 
} 

Nằm trong cơ cấu dự án như thế này:

project structure

(Tôi đang sử dụng IntelliJ IDEA).

+1

Xin chào, tôi dự định sử dụng Play 2.4, có vẻ như Công việc không đồng bộ đã bị xóa khỏi nó? Nếu đó là trường hợp, bạn có biết một cái gì đó có thể thực hiện giống nhau không? – iCodeLikeImDrunk

+1

https://www.playframework.com/documentation/2.4.x/GlobalSettings – Isn0gud

+0

"application.global" có thể được sử dụng trong tệp application.conf để đặt tệp chung ở mọi nơi – Anirudh

3

Trong Play 2.4. + Bạn nên sử dụng tiêm phụ thuộc với móc vòng đời (tùy chọn). Phát sẽ tự động sử dụng bất kỳ lớp nào được gọi là Module có trong gói gốc.

Ví dụ:

app/ApplicationStart.scala:

import scala.concurrent.Future 
import javax.inject._ 
import play.api.inject.ApplicationLifecycle 

// This creates an `ApplicationStart` object once at start-up and registers hook for shut-down. 
@Singleton 
class ApplicationStart @Inject() (lifecycle: ApplicationLifecycle) { 
    // Shut-down hook 
    lifecycle.addStopHook {() => 
    Future.successful(()) 
    } 
    //... 
} 

app/Module.scala:

import com.google.inject.AbstractModule 

class Module extends AbstractModule { 
    override def configure() = { 
    bind(classOf[ApplicationStart]).asEagerSingleton() 
    } 
} 

Nhiều tài liệu của mô hình này trong Playframework docs.

Dưới đây là ví dụ in an application.

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