0

在我的场景中,我通过 WCF 自定义适配器 (oracleDBBinding) 从 MS BizTalk 业务流程执行 oracle 存储过程。此过程在负面情况下抛出自定义异常 (pl/sql RAISE_APPLICATION_ERROR)。

如果 BizTalk 发送端口配置 UseAmbientTransactions = False (这意味着事务没有提升到 MSDTC)我得到

使用 URI“oracledb://myoracledb/”在发送端口“MySendPort”上发送到适配器“WCF-Custom”的消息被挂起。错误详情:Microsoft.ServiceModel.Channels.Common.TargetSystemException: ORA-20901: Deal: 26252741.0.0 has already been processed

如果 BizTalk 发送端口配置 UseAmbientTransactions = True (这意味着事务提升到 MSDTC)我得到

使用 URI“oracledb://myoracledb/”在发送端口“MySendPort”上发送到适配器“WCF-Custom”的消息被挂起。错误详细信息:Microsoft.ServiceModel.Channels.Common.TargetSystemException:ORA-20901:找不到消息 20901;产品=关系型数据库;设施=ORA ---> Oracle.DataAccess.Client.OracleException: ORA-20901: MySendPort; 产品=关系型数据库;设施=ORA

因此,当我在发送端口上启用环境事务时,您可能会看到异常消息丢失。返回错误号,但用字符串 Message XXX not fount 替换消息。仅当我处理在 oracle 端突袭的自定义异常时,才会发生这种情况,错误的用户名和密码等异常被正确检索。

我想知道是oracle客户端+ OracleMTSRecoveryService + MSDTC的错误配置还是oracle客户端的错误

为了说明这一点,我将我的解决方案从 Windows 2008(物理机)上的 BizTalk 2009 迁移到 Windows Server 2012R2(虚拟机)上的 BizTalk 2013R2。在旧版 (BizTalk2009) 上,在启用环境事务的情况下,错误传播按预期工作。我遇到的问题是在新的 BizTalk 2013R2 上,我有新的操作系统新的 Oracle 客户端和新的 BizTalk 版本。所以我猜我在配置/权限中遗漏了一些东西,或者我正在处理 Oracle 客户端/WCF Oracle 适配器中的错误

我的环境: 操作系统:Windows 2012R2 Oracle 客户端:12c (12.1.0) 32 位和 64 位 BizTalk 版本:2013R2 OracleMTSRecoveryService:安装在 64 位 oracle 客户端上

4

2 回答 2

0

因为您正在引发一个导致事务回滚的应用程序错误,然后 BizTalk 将重试并最终得到消息未找到错误(因为响应将在回滚时被丢弃)。

如果它是业务异常,则不应将其作为应用程序异常引发,而应返回包含状态的响应消息,例如 Processed=OK/ERROR 和包含业务失败的 ERROR 节点。

然后,您在 BizTalk 中处理该响应消息。

于 2015-03-03T20:50:19.570 回答
0

我知道这是一个旧线程,但是我发现设置系统环境变量ORAMTS_SESS_REGISTERUCBfalse解决这个问题。

我不完全理解为什么,因为在搜索环境变量时执行 google 搜索只返回一个结果 - ORAMTS_SESS_REGISTERUCB

它可能与架构类型有关,因为我发现在使用Oracle Services For Microsoft Transaction Server安装这两个工具ODAC_x86时会引入这一点。ODAC_x64

于 2018-06-20T14:19:00.363 回答