2011-12-12 48 views
0

我有一個按小時運行的工作。我想要麼像這樣調用Controller的Action方法:Play Framework:從作業中呼叫控制器/ URL

public class MyJob extends Job { 

    @Override 
    public void doJob() throws Exception { 
     MyController.someActionMethod(); 
    } 
} 

或直接調用URL。

任何想法,如果這可以從一個工作內?

如果我把一個控制器的操作方法直接,我得到這個:

NullPointerException occured : null 

play.exceptions.JavaExecutionException 
    at play.jobs.Job.call(Job.java:155) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:207) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:619) 
Caused by: java.lang.NullPointerException 
    at play.classloading.enhancers.ControllersEnhancer$ControllerInstrumentation.isActionCallAllowed(ControllersEnhancer.java:187) 
    at controllers.MyController.someActionMethod(MyController.java) 
    at fun.job.MyJob.doJob(MyJob.java:10) 
    at play.jobs.Job.doJobWithResult(Job.java:50) 
    at play.jobs.Job.call(Job.java:146) 
    ... 7 more 

回答

2

您可以使用WS輔助類。例如,

HttpResponse response = WS.url("http://www.yahoo.com/").get() 
String html = response.getString(); // or... 
Document xml = response.getXml(); 

什麼,你在上面做會嘗試做一個瀏覽器重定向到一個控制器的動作有關的URL,這不會從異步工作的情況下是有意義的,在那裏,除其他原因,沒有瀏覽器來處理重定向。

+0

我試過了,對於外部URL(比如Yahoo),似乎可以正常工作,但對於同一服務器上的URL,也就是調用我自己的控制器操作方法,正如OP描述的那樣。在調試器中逐步完成作業顯示,它在調用get()時掛起,並最終在60秒後超時。有任何想法嗎? –

1

你爲什麼要這麼做?也許一個更好的方法來實現相同的事情是提取行動執行的邏輯到一個新的類/方法,而不是在控制器和工作中調用它。

+0

我正在使用PDF模塊來PDF模板。當前版本的PDF模塊(0.7)需要HTTP請求。我想每15分鐘執行一次PDF,因此可以使用Job。但是,我需要訪問請求才能使PDF模塊正常工作。 – digiarnie