サブクラスString
から aで指定された任意のコントローラ アクションを呼び出そうとしています。Job
この質問に対する受け入れられた回答を試しましたが、うまくいかないことがわかりました...WS.url("http://www.yahoo.com/").get();
動作しますが、WS.url("http://localhost/foo/bar").get()
ブロックされ、最終的に60秒後にタイムアウトします。
この回答で推奨されているようplay.pool
に、 の値を増やしてみましたが、違いはありませんでした。application.conf
これが私のコードです:
アプリケーション.conf:
# Execution pool
# ~~~~~
# Default to 1 thread in DEV mode or (nb processors + 1) threads in PROD mode.
# Try to keep a low as possible. 1 thread will serialize all requests (very useful for debugging purpose)
play.pool=3
ルート:
PUT /jobs/invokejob Jobs.invokeTestJob
GET /jobs/sampleAction Jobs.sampleControllerAction
Jobs.java:
public static void invokeTestJob()
{
Logger.warn("Jobs.invokeTestJob() called");
new SampleJob("Jobs.sampleControllerAction").in(1);
Logger.warn("Finished scheduling SampleJob");
listJobs();
}
public static void sampleControllerAction()
{
Logger.warn("Jobs.sampleControllerAction() called");
renderText("OK");
}
サンプルジョブ.java:
public class SampleJob extends QJob
{
public final String action;
public SampleJob(String actionSpec)
{
this.action = actionSpec;
}
@Override
public void doJob()
{
Logger.warn("SampleJob.doJob() called");
final ActionDefinition actionDefinition = Router.reverse(action);
actionDefinition.absolute();
final WSRequest URL = WS.url(actionDefinition.url);
HttpResponse response = null;
switch(actionDefinition.method)
{
case "GET":
{
Logger.warn("GETting %s", URL.url);
response = URL.get();
break;
}
case "POST":
{
Logger.warn("POSTting %s", URL.url);
response = URL.post();
break;
}
case "PUT":
{
Logger.warn("PUTting %s", URL.url);
response = URL.put();
break;
}
case "DELETE":
{
Logger.warn("DELETEing %s", URL.url);
response = URL.delete();
break;
}
}
Logger.warn("response=%s", response.getString());
}
}
ログ出力:
13:22:50,783 WARN [play-thread-1] ~ Jobs.invokeTestJob() called
13:22:50,786 WARN [play-thread-1] ~ Finished scheduling SampleJob
13:22:51,804 WARN [jobs-thread-1] ~ SampleJob.doJob() called
13:22:51,857 WARN [jobs-thread-1] ~ GETting http://localhost/quattro/jobs/sampleAction
13:23:51,886 ERROR [jobs-thread-1] ~
@6fe61pf2p
Error during job execution (jobs.SampleJob)
Execution exception (In {module:quattro}/app/jobs/SampleJob.java around line 36)
RuntimeException occured : java.util.concurrent.ExecutionException: java.util.concurrent.TimeoutException: No response received after 60000
play.exceptions.JavaExecutionException: java.util.concurrent.ExecutionException: java.util.concurrent.TimeoutException: No response received after 60000
at play.jobs.Job.call(Job.java:155)
at play.jobs.Job$2.call(Job.java:94)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.util.concurrent.TimeoutException: No response received after 60000
at play.libs.ws.WSAsync$WSAsyncRequest.get(WSAsync.java:223)
at jobs.SampleJob.doJob(SampleJob.java:36)
at play.jobs.Job.doJobWithResult(Job.java:50)
at play.jobs.Job.call(Job.java:146)
... 8 more
Caused by: java.util.concurrent.ExecutionException: java.util.concurrent.TimeoutException: No response received after 60000
at com.ning.http.client.providers.netty.NettyResponseFuture.get(NettyResponseFuture.java:223)
at com.ning.http.client.providers.netty.NettyResponseFuture.get(NettyResponseFuture.java:187)
at play.libs.ws.WSAsync$WSAsyncRequest.get(WSAsync.java:221)
... 11 more
Caused by: java.util.concurrent.TimeoutException: No response received after 60000
at com.ning.http.client.providers.netty.NettyResponseFuture.get(NettyResponseFuture.java:215)
... 13 more
13:22:51,857
との間の時間差に注意してください13:23:51,886
-- これが 60 秒のタイムアウトです。
何が問題なのですか?
今のところ、この単純なケースを機能させようとしています。後で、リクエストとともに Cookie などを提供する必要があります。
WS
また、別のホスト上の Web サービスに実際にアクセスしようとしているわけではないので、これを使用するという考えにはあまり満足していません。自分のアプリにあるコードを呼び出そうとしているので、実際の HTTP リクエストを自分自身に返す必要があるのは少しばかげているようです。リクエストの内容を内部で構築し、アクション メソッドを直接呼び出す方法はありませんか?
前述のように、これの目的は、任意のコントローラー アクションをシステム内のジョブとしてスケジュールできるようにすることです。一部のコントローラー コードが既に行っていることを実行するジョブをスケジュールする必要があるたびに、コードを記述する必要がないようにしたいと考えています。