gpt4 book ai didi

java - BlockingQueue 阻止并返回对象,直到具有指定 id 的对象在队列中可用

转载 作者:太空宇宙 更新时间:2023-11-04 06:12:09 25 4
gpt4 key购买 nike

我在一些中间应用程序中有一些遗留代码,其中请求响应方法是同步的。现在后端的新接口(interface)是异步的,但我必须在中间应用程序中模拟同步请求。我需要进行请求调用并等待异步响应的到来。它是多线程应用程序,其中将有多个同时请求和响应。

我想知道java中是否有某种阻塞队列,我可以在其中放置请求对象并等待具有指定id(通过equals方法)的响应对象放回到队列中。因此,将有两个方法将对象放入队列,假设它们是 requestSender 和 responseReceiver。请求发送者将发出请求并等待,然后responseReceiver将所有响应放入队列中,当响应对象匹配时,只有关联的requestSender将获取该对象并将其返回到前端。

简而言之,队列中是否有类似 take(object) 方法,并且仅当队列中的特定对象可用时才会返回。

如果阻塞队列不可能做到这一点,那么当后端到中间应用程序异步时,我应该使用什么其他方法来模拟前端中间应用程序中的同步请求响应。

提前非常感谢您。

最佳答案

这就是我现在实现的解决方案,如果有更好的方法请告诉我,谢谢

public class OrderFixResponseBlockingQueue {

private Map<OrderFixKey, ArrayBlockingQueue<FxOrder>> responseQueueMap = new HashMap<OrderFixKey, ArrayBlockingQueue<FxOrder>>();


public FxOrder get(FxOrder order, int timeoutInSecs) {
try {

OrderFixKey key = new OrderFixKey(order);
ArrayBlockingQueue<FxOrder> orderQueue = new ArrayBlockingQueue<FxOrder>(1);
responseQueueMap.put(key, orderQueue);

FxOrder responseOrder = orderQueue.poll(timeoutInSecs, TimeUnit.SECONDS);
responseQueueMap.remove(orderQueue);

return responseOrder;

} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}


public void put(FxOrder order) {
OrderFixKey key = new OrderFixKey(order);
ArrayBlockingQueue<FxOrder> queue = responseQueueMap.get(key);

if (queue != null) {
queue.add(order);
} else {
System.out.println("Put queue not available, should be a request timeout");
}
}

private class OrderFixKey {
private final String orderId;

OrderFixKey(FxOrder order) {
this.orderId = order.getOrderId();
}

@Override
public boolean equals(Object obj) {
if (obj instanceof FxOrder) {
FxOrder that = (FxOrder) obj;
return this.orderId.equals(that.getOrderId());
}
return false;
}

@Override
public int hashCode() {
return this.orderId.hashCode();
}
}
}

关于java - BlockingQueue 阻止并返回对象,直到具有指定 id 的对象在队列中可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28568065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com