2

これは、 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();

すべてが期待どおりに機能します。

4

1 に答える 1

3

AsyncHttpClientここで作成されたすべてのインスタンスを閉じる必要があります。

Future<Response> r = new AsyncHttpClient().prepareGet(
                "http://google.com").execute();

メソッドを使用しclose()ます。の各インスタンスは、AsyncHttpClientクリーンアップする必要のあるいくつかのリソース(スレッドなど)を作成します。

ただし、AsyncHttpClientはスレッドセーフであるため、はるかに優れたアプローチは、1つのグローバルインスタンスのみを作成しAsyncHttpClient、アプリケーションの存続期間中および複数のスレッドからそれを再利用することです。

最後に、基本的にいくつかの要求を送信し、応答を同期的に(ブロックして)待つので、標準URLConnection(例のように)またはHttpClientを使用してみませんか?AsyncHttpClient同期的に応答を待ちたくない場合、たとえば、数百のスレッドを生成せずに数百のHTTP要求を同時に開始したい場合に最適です。AsyncHttpClient次に、応答が表示されたときにコールバックコードを呼び出します。

于 2012-10-16T17:47:06.680 に答える