Запуск асинхронного процесса в Java - PullRequest
0 голосов
/ 22 декабря 2011

У меня есть веб-приложение, которое принимает запросы пользователей и помещает их в базу данных MYSQL.Теперь типичный запрос пользователя необходимо обслуживать, следуя рабочему процессу, выполнение которого займет значительное время.Чтобы решить эту проблему, у меня есть асинхронный процессор, который продолжает слушать таблицу MYSQL.

Я заметил, что опрос таблицы MYSQL по бесконечному циклу приводит к скачку загрузки ЦП в окне, на котором развернуто мое приложение.часто делает окно неработоспособным.

Я знаю, что отключение асинхронного процесса на «некоторое время», когда нет активных запросов в базе данных MYSQL, является вариантом, но я хотел бы сохранить это как последнийresort.

Синхронизация этого процесса невозможна из-за времени, которое занимает рабочий процесс, связанный с обслуживанием одного запроса, а также из-за необходимости отделить обработку от внешнего интерфейса, чтобы позволить внутреннемуevolve.

Я хотел бы знать, есть ли какой-нибудь разумный способ инициировать асинхронный процесс, чтобы я мог избежать скачка загрузки процессора и при этом получить оптимальное время отклика от асинхронного процессора.

Любые советы будут оценены.

Чемks p1ng

Ответы [ 4 ]

1 голос
/ 22 декабря 2011

Для этого вы можете использовать Java API FutureTask. Смотрите эту запись в блоге .

Или, возможно, просто new Thread(YourRunnable).start() и задайте некоторую переменную состояния в YourRunnable, чтобы узнать, завершена ли ваша задача или нет.

1 голос
/ 22 декабря 2011

Вы можете сделать так, чтобы ваш асинхронный процесс читался из сокета TCP или чего-то подобного.Асинхронный процесс должен просто ждать блокировки ввода-вывода.Затем из основного процесса вы можете отправить сообщение асинхронному процессу после обновления таблицы.Также возможно отправить сообщение из триггера в базу данных.

1 голос
/ 22 декабря 2011

Я бы вообще не рекомендовал подход на основе опросов для проверки таблицы. Что происходит, когда вам приходится опрашивать разные события в разных расписаниях? Если в будущем вам понадобится несколько событий, я бы посоветовал изучить очереди сообщений для асинхронных задач.

Но если вам пока придется придерживаться подхода, основанного на опросе, - я не до конца понимаю вашу аргументацию против того, чтобы асинхронный процесс некоторое время спал? Почему вы хотите, чтобы ваш процесс занимал все ресурсы ЦП, не делая ничего, кроме работы в бесконечном цикле? Почему бы не запустить асинхронный процесс через определенные промежутки времени? Вы можете настроить этот интервал опроса.

1 голос
/ 22 декабря 2011

Можно было бы сохранить запрос в базе данных и отправить какое-либо событие в вашей системе (например, сообщение JMS или с помощью конструкций java.util.concurrent).Процесс, который считывает и выполняет команду, может затем быть активирован этим сигналом, перейти к получению данных в базе данных и обработать их как обычно.

Таким образом, вы не будете тратить циклы ЦП на опрос, пока недоступных данных, и вы будете более реагирующими из-за отсутствия задержки опроса.

...