如何使用 OutboundDeliveryV2ServiceBatch 访问批处理请求中包含的单个更新请求的 HTTP 状态代码?
How to access HTTP Status Code for individual update request contained in a batch request using OutboundDeliveryV2ServiceBatch?
我们有一个要求,我们必须更新多个 OutbDeliverItem
。出于效率原因,我们选择了 OData 批处理请求。
最初我们使用 BatchRequestBuilder
构建批处理请求,在执行 BatchRequest.execute()
后,我们能够获得一个 BatchResult
对象。然后我们可以调用 BatchResult.get()
来获得 List<BatchResultPart>
。然后我们能够遍历该列表并能够调用 BatchResultPart.getHttpStatusCode()
来获取各个更新请求的 HTTP 状态代码。下面是它的代码片段(省略异常处理并保持简单):
BatchRequest batchRequest = // Generate batch request;
BatchResult batchResult = batchRequest.execute(// Some destination);
for (BatchResultPart resultForLineItem : batchResult.get()) {
if (resultForLineItem.getHttpStatusCode() != Response.Status.ACCEPTED.getStatusCode()) {
// Do something
}
}
要求是我们必须检查每个项目的 HTTP 状态代码并执行一些业务逻辑。
但现在我们决定使用 OutboundDeliveryV2ServiceBatch
来更新项目。新代码片段如下所示(省略异常处理并保持简单):
OutboundDeliveryV2ServiceBatchChangeSet changeSet = outboundDeliveryService.beginChangeSet();
items.forEach(changeSet::updateOutbDeliveryItem); // items is a List<OutbDeliveryItem>
BatchResponse batchResponse = changeSet.endChangeSet().execute(destination);
问题是上面的 batchResponse
只提供了一个方法 get(index)
,其中 returns 一个 io.vavr.control.Try<BatchResponseChangeSet>
。在这个对象上我们可以调用isSuccess()
、a/t this blog post。但这是针对整个变更集,而不是针对变更集中的个别更新。此外,BatchResponseChangeSet
上没有任何方法可以帮助我们访问各个更新的响应。有一种方法 BatchResponseChangeSet.getCreatedEntities()
,不幸的是,它对我们没有用,因为它不提供有关该项目的单个更新状态的任何信息。
请为我们指出正确的方向,说明我们如何使用 BatchRequestBuilder
实现的功能可以通过使用 OutboundDeliveryV2ServiceBatch
实现。
谢谢。
引用官方OData V2 spec批处理:
All operations in a ChangeSet represent a single change unit so the
server must successfully process and apply all the requests in the
ChangeSet or else apply none of the requests in the ChangeSet.
据此,一个更改集中的各个操作具有不同的 "results"(在成功与否的意义上)似乎违反了规范。这就是为什么 SAP Cloud SDK 的 API 允许您检查整个变更集的结果。
同一更改集中的所有单独操作都成功或 none,但没有别的。
根据该结论,关于 getCreatedEntities
我们可以推导出它允许您访问同一变更集中的所有 created/updated 实体。
加法:
如果适合您的业务需求,请考虑将每个更新操作放入其自己的单独更改集中。然后,您将能够计算出每个更改集的结果(以及每个相应更新操作的结果)。请注意,使用此方法您不会利用更改集的概念,因为它确保您所有或 none 更新操作都成功。
我们有一个要求,我们必须更新多个 OutbDeliverItem
。出于效率原因,我们选择了 OData 批处理请求。
最初我们使用 BatchRequestBuilder
构建批处理请求,在执行 BatchRequest.execute()
后,我们能够获得一个 BatchResult
对象。然后我们可以调用 BatchResult.get()
来获得 List<BatchResultPart>
。然后我们能够遍历该列表并能够调用 BatchResultPart.getHttpStatusCode()
来获取各个更新请求的 HTTP 状态代码。下面是它的代码片段(省略异常处理并保持简单):
BatchRequest batchRequest = // Generate batch request;
BatchResult batchResult = batchRequest.execute(// Some destination);
for (BatchResultPart resultForLineItem : batchResult.get()) {
if (resultForLineItem.getHttpStatusCode() != Response.Status.ACCEPTED.getStatusCode()) {
// Do something
}
}
要求是我们必须检查每个项目的 HTTP 状态代码并执行一些业务逻辑。
但现在我们决定使用 OutboundDeliveryV2ServiceBatch
来更新项目。新代码片段如下所示(省略异常处理并保持简单):
OutboundDeliveryV2ServiceBatchChangeSet changeSet = outboundDeliveryService.beginChangeSet();
items.forEach(changeSet::updateOutbDeliveryItem); // items is a List<OutbDeliveryItem>
BatchResponse batchResponse = changeSet.endChangeSet().execute(destination);
问题是上面的 batchResponse
只提供了一个方法 get(index)
,其中 returns 一个 io.vavr.control.Try<BatchResponseChangeSet>
。在这个对象上我们可以调用isSuccess()
、a/t this blog post。但这是针对整个变更集,而不是针对变更集中的个别更新。此外,BatchResponseChangeSet
上没有任何方法可以帮助我们访问各个更新的响应。有一种方法 BatchResponseChangeSet.getCreatedEntities()
,不幸的是,它对我们没有用,因为它不提供有关该项目的单个更新状态的任何信息。
请为我们指出正确的方向,说明我们如何使用 BatchRequestBuilder
实现的功能可以通过使用 OutboundDeliveryV2ServiceBatch
实现。
谢谢。
引用官方OData V2 spec批处理:
All operations in a ChangeSet represent a single change unit so the server must successfully process and apply all the requests in the ChangeSet or else apply none of the requests in the ChangeSet.
据此,一个更改集中的各个操作具有不同的 "results"(在成功与否的意义上)似乎违反了规范。这就是为什么 SAP Cloud SDK 的 API 允许您检查整个变更集的结果。
同一更改集中的所有单独操作都成功或 none,但没有别的。
根据该结论,关于 getCreatedEntities
我们可以推导出它允许您访问同一变更集中的所有 created/updated 实体。
加法:
如果适合您的业务需求,请考虑将每个更新操作放入其自己的单独更改集中。然后,您将能够计算出每个更改集的结果(以及每个相应更新操作的结果)。请注意,使用此方法您不会利用更改集的概念,因为它确保您所有或 none 更新操作都成功。