1

我的项目基于 GAE/J 并利用最近推出的 PULL 队列,但我认为这个问题也可以应用于 Python。

基本上,当我将任务放入 PULL 队列时,我需要设置任务的一些参数,以供后面的消费者拾取。

我已经以两种方式在参数设置中实现了:

1)通过使用param()

TaskOptions taskOptions = TaskOptions.Builder.
                withMethod(TaskOptions.Method.PULL);
taskOptions.param("param", paramValue);
taskOptions.param("param2", paramValue2);

2)通过使用payload()

TaskOptions taskOptions = TaskOptions.Builder.
                    withMethod(TaskOptions.Method.PULL);
taskOptions.payload("payloadValue");

两种方法都有效,但是,我想知道两者之间的区别是什么,就效率或便利性而言,哪种方式应该是首选方式。

我可以看到,通过使用param(),很容易设置多个参数,也很容易为消费者检索参数。但是对于一种参数情况,有效负载可能会更方便,因为它可以保存代码以捕获消费者提取参数时抛出的异常。

但是,除了我所说的之外,我很高兴知道这两者之间的更多区别。

4

2 回答 2

1

根据python 文档,我会说在你的情况下是完全一样的。

在 PULL 请求中,如果您已经指定了有效负载,请不要指定参数。参数被编码为 application/x-www-form-urlencoded 并设置为有效负载。

于 2012-06-14T00:32:20.073 回答
1

TaskOptions 的 .param() 和 .payload() 函数有区别。您可以按如下方式使用这些功能;

  1. taskOptions.param("param1","Invoice_3344"); 现在在接收端,假设您正在调用一个 servlet ,在 HttpRequest 中,您可以接收发送的参数作为请求参数。

    公共类 MyInvoiceTask 扩展 HttpServlet{ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String invoiceNum = request.getParameter("param1"); } }

  2. 现在假设你想序列化你的整个自定义类对象,它有大量的数据。在这种情况下,您需要在内部使用 .payload() 函数,它将有效负载数据发送到请求正文中。

    //**自定义类对象 Person person = new Person("Abc", "Mumbai", 22);

    //**将对象转换为JSON,以便可以转换为String(Payload需要)

    //**使用 Gson 库 Gson gson = new Gson(); 字符串 personObjString = gson.toJson(person); //**将payload作为字节数组放入task option中 taskOption.payload(personObjString.toByteArray());

    现在在接收端,假设使用 servlet,然后从 HttpRequest 对象,我们需要获取有效负载字节数组并将其转换回 cutsom 对象,即在我们的示例中为“Person”类对象。私有字节[] getPayloadFromHttpRequest(HttpServletRequest req) 抛出 IOException { InputStream inputStream = req.getInputStream(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        int length;
        byte[] buffer = new byte[1024];
    
        while ((length = inputStream.read(buffer)) >= 0)
            byteArrayOutputStream.write(buffer, 0, length);
    
        if (byteArrayOutputStream.size() > 0){
            return byteArrayOutputStream.toByteArray();
        }
        return null;
    }
    

    //**现在接收到的 byteArray 可以与 Gson 一起使用,将其转换回 Person 对象 byte[] payload = getPayloadFromHttpRequest(request); Gson gson = 新 Gson(); String personJsonString = new String(payload); 人 person = gson.fromJson(personJsonString, Person.class);

于 2017-05-28T02:42:46.587 回答