如果 POST 请求包含已在处理的 ID,如何在 Java 中暂停该请求

问题描述 投票:0回答:1

因此,我们负责使用第三方应用程序的 Java 基本代码在第三方应用程序中创建自定义,并且我们需要创建一个 POST API。通过 POST,会发送一条包含产品对象数据的 JSON 消息,并且在该 JSON 消息中,您具有属性“ItemID”,这是其唯一标识符。一旦收到我们的代码,就可以使用此消息在我们这边的基础应用程序中创建或更新所述对象。基础应用程序构建了一个我们用于此目的的 API 库,由于某种原因,该库不允许 POST 请求使用多个参数(对于任何可能的解决方案都很重要)。问题是,在测试中我们注意到,客户端经常会在同一个对象上发送多个请求(相隔几毫秒),这会导致基础应用程序同时在同一个对象上工作,从而导致冲突或创建相同的对象。 objct 两次,因为第二个请求检查对象是否存在的速度比第一个请求第一次创建该对象的速度更快。这就是我们编写的(部分)代码:

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONObject;

    @POST
    @Path("ObjectItem")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public JSONObject processObjectItem(String JSON) throws Exception {
        
        JSONObject jData = new JSONObject(JSON);
       
        JSONArray jItems = jData.getJSONArray("Items");
        JSONObject productItem = jItems.getJSONObject(0);
        
        Long id = productItem.getLong("ItemID");
        Product productBean = new productBean(productItem);

        
        Asset product = getProductById(id);
        if (product == null) {
            createProduct(id, productItem);
        } 
        else {
            updateProduct(id, productItem);
        }

        JSONObject result = new JSONObject();
        result.put("status", "success");
        result.put("message", "Items processed successfully");
        return result;
    }

有谁知道如何最好地解决像我上面描述的那样的冲突?如果“ItemID”已被处理,是否可以将 POST 请求放入队列?

我们尝试了一种异步方法和一个包含路径中 ID 的 POST id,但基础应用程序不允许 POST 方法有多个参数。我们只需要代码来处理使用相同 ID 的快速请求,并确保它们按顺序处理,而不是同时处理。

java post
1个回答
0
投票

如果您最终有一个排队策略,将会有所帮助。收到产品后,您必须将其存储在某处并将其标记为“正在进行中”,以对其进行跟踪。收到产品后,您应该检查其处理状态,然后将其提交给下层API。提交后,您应该将其从队列中删除。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.