Вот простой планировщик Quartz, который должен запускать задание раз в минуту; задание само по себе делает HTTP-запрос, используя Sonatype Async Http Client. Используя jvisualvm
, я смог обнаружить потоки, порождаемые и никогда не закрывающиеся, например. они застряли в ожидании. Это наводит меня на мысль, что либо А) я неправильно понимаю, как Quartz работает с этой конкретной настройкой, либо Б) что-то еще не так. Наверное А :) Планировщик:
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... и так далее.
ИЗМЕНИТЬ:
Я смог убедиться, что это комбинация AsyncHttpClient и Quartz, например, когда я заменил метод makeRequest
стандартным запросом:
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();
Все работает как положено.
jvisualvm
)? Они висят наr.get()
? Отображается ли когда-нибудь"Request status: "
? И зачем использовать асинхронный клиент, если вы все равно ждете ответа синхронно? - person Tomasz Nurkiewicz   schedule 16.10.2012