Google App Engine 拉取队列的参数和有效负载之间的区别



我的项目基于 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(),设置多个参数很容易,也很容易为消费者检索参数。但是对于一个参数情况,则有效负载可能会更方便,因为它保存代码以捕获消费者提取参数时抛出的异常。

但是,除了我所介绍的内容之外,我很高兴知道这两者之间的更多差异。

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

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

TaskOptions 的 .param() 和 .payload() 函数存在差异。您可以按如下方式使用这些函数;

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

    public class MyInvoiceTask 扩展了 HttpServlet{ protected void doGet(HttpServletRequest request, HttpServletResponse response) 抛出 ServletException, IOException { String invoiceNum = request.getParameter("param1"); } }

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

    /

    /**自定义类对象 人 = 新人("abc", "孟买", 22);

    /

    /**将对象转换为 JSON,以便可以转换为字符串(有效负载需要)

    /

    /**使用 Gson 库 Gson gson = new Gson(); String personObjString = gson.toJson(person); **将有效负载放在任务选项中作为字节数组 taskOption.payload(personObjString.toByteArray());

    现在在接收端,假设使用 servlet,然后从 HttpRequest 对象,我们需要获取有效负载字节数组并将其转换回 cutsom 对象,即我们例中的"Person"类对象。private byte[] 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 = new Gson();String personJsonString = new String(payload);Person person = gson.fromJson(personJsonString, Person.class);

相关内容

最新更新