Из технологий, которые вы упомянули, JMX не имеет отношения к проблеме, и, хотя JMS, вероятно, будет работать, это, вероятно, будет излишним (количество усилий по настройке может быть значительным, в зависимости от вашей платформы). Кварц также является опцией, хотя сильные стороны Кварца заключаются в планировании по типу cron и кластерном планировании, ни один из которых не кажется вам необходимым.
Похоже, вам необходимо отправить задачу в очередь, выполнить эти задачи из очереди по очереди, и если одна из них завершится с ошибкой по определенной причине, затем приостановить дальнейшую обработку в течение определенного периода времени, а затем повторите попытку с предыдущим заданием.
Самый простой подход, который я могу придумать, очень похож на другой вопрос, который вы упомянули: использовать Spring TaskExecutor
абстракцию , но с изюминкой.
Если ваше требование состоит в том, что очередь должна «удерживаться» в течение фиксированного периода времени при обнаружении сбоя веб-службы, то вы можете полностью справиться с этим в рамках выполняемой задачи, например,
public class MyTask implements Runnable {
public void run() {
while (true) {
try {
performWork();
return;
} catch (WebServiceFailure f) {
sleepForFixedPeriod();
}
}
}
}
Конфигурирование ThreadPoolTaskExecutor
- это Spring, для maxPoolSize
установлено 1
. Затем ваш клиентский код отправляет исполнителям объекты рабочих задач (например, те, что указаны выше).
Если бы вы увеличили corePoolSize
исполнителя до значения, превышающего 1
, то вы могли бы использовать преимущества нескольких ядер для повышения пропускной способности, позволяя исполнителю использовать несколько потоков, но «лови и повторение "логика будет применяться только для каждого потока.
Это не самое элегантное решение, но оно очень простое, понятное и настраиваемое.