sql - 在 BizTalk 中的原子事务中发送/接收

标签 sql wcf biztalk transactionscope biztalk-2013

我有一个 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/

相关文章:

sql - 对非数值数据使用数据透视

wcf - 可以在WCF中合并通话吗?

sql-server-2008-r2 - Biztalk 不跟踪发送/接收端口

MySQL搜索并替换字段中的一些文本

sql - 在 SQL Server 中将 while 循环值作为多行而不是多个结果集返回

c# - 你调用的对象是空的。在 wcf 服务中

c# - system.serviceModel/bindings/wsHttpBinding 处的绑定(bind)没有已配置的绑定(bind)

interface - Jitterbit 与 BizTalk

biztalk - 在 Biztalk 发送/接收端口停止或被禁用时设置通知

sql - 使用 with 子句更新语句