У меня есть верблюжий маршрут, который выполнит обновление для данного идентификатора.
Для одного запроса все работает нормально, скажем Если у меня несколько запросов с одним и тем же идентификатором, скажем 10, то я хочуодин запрос выполняется за один раз .
или заставляет ждать другой запрос с тем же идентификатором, в то время как у меня есть запрос с другим идентификатором, который можно обработать без ожидания, скажем, 12.
Дляэто я создал дополнительный маршрут в моем контексте верблюда "addRequestToPool", который направит весь запрос, приходящий к верблюду "updateTicket", в 1 место, и оттуда должна быть выполнена обработка 1 на 1.
Iхотите реализовать что-то вроде ниже :
Когда запрос приходит к методу «synchronizeRequests», он должен проверить, существует ли уже существующее задание с docketId, если есть make, дождаться завершения старого процесса (скажем,10). если такого идентификатора нет (скажем, 12), продолжайте обработку.
Как только старый процесс завершен, он должен сообщить другим работам с тем же идентификатором, ожидающим, что 1 из них может возобновить там работу с того места, где они ожидают, так что ответ должен быть отправлен.
Сбор запросов выполнениз маршрута "addRequestToPool", как только приходит запрос, он создает поток для каждого запроса и вызывает метод синхронизации. Внутри метода синхронизации «RequestSynchronization» я хочу выполнить операцию проверки для существующего задания с идентификатором, если оно существует, дождаться уведомления от предыдущего, если не получен ответ, и продолжить обработку.
После завершения задания с использованием маршрута »removeRequestFromPool "текущий идентификатор задания удаляется, и о новом задании в группе (тот же идентификатор) следует уведомлять о продолжении.
Я хотел бы знать, как реализовать описанный выше сценарий или любой другой подходящий подход, еслиany?
Ниже приведен пример кода для справки,
Верблюжий маршрут:
from("direct:updateTicket")
.to("direct:addRequestToPool")
.to("direct:getDetailForTicket")
.to("direct:updateDetailForTroubleTicket")
.to("direct:getDetailForTicket")
.to("direct:removeRequestFromPool")
.to("direct:endRoute");
Вызов API:
public class TicketRequestManagement {
public SimpleActionResponse addRequestToPool(int docketNo) throws InterruptedException {
SimpleActionResponse response = new SimpleActionResponse();
RequestSynchronization requestSynchronization = new RequestSynchronization(docketNo);
Thread thread = new Thread(requestSynchronization);
thread.start();
thread.join();
return response;
}
}
Метод синхронизации:
public class RequestSynchronization implements Runnable {
private static Logger logger = Logger.getLogger(RequestSynchronization.class);
private int docketNo;
public RequestSynchronization(int docketNo) {
super();
this.docketNo = docketNo;
}
@Override
public void run() {
synchronizeRequests(docketNo);
}
public synchronized static void synchronizeRequests(int docketNo) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Я думал о добавлении docketId в статическую структуру данных (Set) и проверке, существует ли Id wait (Как мне выполнить это ожидание?), Как только процесс завершится, удалите ID из set и уведомитеожидание возобновления оттуда (как мне выполнить это уведомление с тем же идентификатором?).
Дайте мне знать, еслинужна какая-то ясность.
PS: я не ищу сна, это просто для выполнения теста синхронизации.
Заранее спасибо.