我有一个 Biztalk 2013 Orchestration,正在处理一个使用管道调用对消息进行分批处理的项目。然后,我获取分批消息,使用它们创建 SQL WCF 适配器请求以获取详细信息,然后分批响应并将其写入系统。
示例 XML:
带有订单的信封
<Orders>
<Order>
<OrderNum>1</OrderNum>
</Order>
<Order>
<OrderNum>2</OrderNum>
</Order>
<Order>
<OrderNum>3</OrderNum>
</Order>
<Order>
<OrderNum>4</OrderNum>
</Order>
<Order>
<OrderNum>5</OrderNum>
</Order>
<Order>
<OrderNum>6</OrderNum>
</Order>
<Order>
<OrderNum>7</OrderNum>
</Order>
</Orders>
被分解为单独的订单消息:
<Order>
<OrderNum>1</OrderNum>
</Order>
.
.
.
通过创建一个以订单号作为参数的存储过程调用消息,将其传递到 SQL 中。
回应:
<OrderDetails>
<OrderDetail>
<ItemID>1</ItemID>
<Price>23.40</Price>
</OrderDetail>
.
.
.
</OrderDetails>
然后,我使用编排中的管道分批处理各个 OrderDetail 记录。
无论如何,当我调用 SQL Server 并获得响应时,我在编译时收到有关
的错误"an atomic scope may not contain or call a service or scope that contains both the send and the corresponding receive of a requestresponse operation on a 'uses' port or servicelink".
我将作用域对象的事务级别(分批所需)从原子更改为长时间运行,然后收到此错误。
"a non-serializable object type 'Microsoft.XLANGs.Pipeline.ReceivePipelineOutputMessages GetBatchPipelineOutput' can only be declared within an atomic scope or service"
我需要获取列表中的各个项目(它可能是一个很长的列表,因此我使用管道的原因)并将它们作为参数传递给 SQL Server,但似乎我不能。
有什么想法吗?
最佳答案
不幸的是,你陷入了原子惩罚框。但是,如果您可以接受您预期行为的改变,那么您想要的事情肯定可以实现。
您可以将后续处理、SQL 调用等逻辑移至已启动的编排(而非已调用),这将逃脱分批编排的原子范围。
但是,请注意,在原始消息完全反批处理之前,启动的编排实际上不会被激活,因为在原子作用域完成之前,启动消息不会提交到 MessageBox。
关于sql - 在 BizTalk 中的原子事务中发送/接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21492705/