我有一条骆驼路线,它将对给定的ID进行更新。
对于单个请求,一切正常,例如如果我有多个具有相同ID的请求,例如10,那么我希望一次执行单个请求。
或等待具有相同ID的其他请求,同时,如果我有具有其他ID的请求而无需等待12就可以处理。
为此,我在骆驼上下文“ addRequestToPool”中创建了一条附加路由,它将所有到达骆驼“ updateTicket”的请求路由到1个地方,并应从那里进行1个1个处理。
我要实现以下类似的功能:
当请求到达“ synchronizeRequests”方法时,它应检查是否已经存在带有docketId的作业,是否有等待直到旧进程完成(例如10)。如果没有这样的ID(例如12),则继续处理。
一旦旧进程完成,它应该告诉其他具有相同ID的作业等待,其中1个可以从他们等待的地方继续进行工作,以便发送响应。
请求收集是通过路由“ addRequestToPool”完成的,一旦请求到来,它将为每个请求创建一个线程并调用syncize方法。在同步方法“ RequestSynchronization”中,我想对具有ID的现有Job执行检查操作(如果存在),如果没有返回响应,则等待上一个通知,然后继续进行处理。
一旦使用路由“ removeRequestFromPool”结束了作业,则将删除该作业的当前ID,并应通知该组中的新作业(相同ID)继续。
我想知道如何实现上述方案或任何其他合适的方法?
下面是供参考的示例代码
骆驼路线:
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添加到静态数据结构(集合)中,并在过程完成后检查是否存在ID等待(我应如何执行此等待?),从集合中删除ID并通知等待过程从那里恢复(如何执行此通知相同的ID?)。
让我知道是否需要澄清。
PS:我不是要睡觉,这只是为了进行同步测试。
谢谢。