これは、 1分ごとに1回ジョブを実行する必要がある単純なQuartzスケジューラです。ジョブ自体は、SonatypeAsyncHttpクライアントを使用してHTTPリクエストを作成します。を使用してjvisualvm
、スレッドがスポーンし、決して閉じないことを検出できました。たとえば、スレッドが待機状態になっている場合などです。これにより、A)Quartzがこの特定のセットアップでどのように機能するかを誤解しているか、B)他の何かが間違っていると私は信じています。おそらくA:)スケジューラー:
public class QuartzAsyncHttpThreadTest {
/* TEST */
@SuppressWarnings("rawtypes")
private static Class jobToRun = AsyncHttpRequestJob.class;
private static String cron = "0 0/1 * * * ?";
/* TEST */
public static void main(String[] args) throws SchedulerException {
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
start(scheduler, jobToRun.getName(), jobToRun);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void start(Scheduler scheduler, String name, Class job)
throws SchedulerException {
JobKey monitorKey = new JobKey(name + "_job", "jobs");
JobDetail detail = JobBuilder.newJob(job).withIdentity(monitorKey)
.build();
Trigger cronDef = TriggerBuilder.newTrigger()
.withIdentity(name + "_trigger", "triggers")
.withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
scheduler.scheduleJob(detail, cronDef);
}
}
仕事:
public class AsyncHttpRequestJob implements Job {
public AsyncHttpRequestJob() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException {
System.out.println("Go..");
makeRequest();
}
public static void makeRequest() {
try {
Future<Response> r = new AsyncHttpClient().prepareGet(
"http://google.com").execute();
Response response = r.get();
System.out.println("Request status: " + response.getStatusCode()); // 301
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
それほど多くはありません。ライブスレッドのプロファイルを作成すると、2分後に侵入が目立ちます。最初の24、27、30よりも...など。
編集:
makeRequest
メソッドを標準のリクエストと交換したときのように、AsyncHttpClientとQuartzの組み合わせであることを確認できました。
URL conn = new URL("http://google.com");
URLConnection httpR = conn.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(
httpR.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
すべてが期待どおりに機能します。