我的项目基于 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() 函数存在差异。您可以按如下方式使用这些函数;
-
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"); } }
-
现在假设您要序列化包含大量数据的整个自定义类对象。在这种情况下,您需要在内部使用 .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);