BizTalk Server常见问题处理
BizTalk Server常见问题处理
在开始开发BizTalk项目的时候,一些开发者会碰到许多基础问题,本文对这些常见问题进行罗列,其中有个别问题笔者向微软的BizTalk工程师寻求了问题解决方案,旨在让使用BizTalk的技术人员更快的进行开发。文中的内容基于BizTalk Server 2006和Visual Studio 2005。
1.在多列结果上不支持数据流
错误信息:
适配器“SQL”返回一条错误消息。详细信息为“HRESULT="0x80004005" Description="在多列结果上不支持数据流"”。
解决方法:
可能解决的情况是对SQL查询语句或存储过程加上“FORXMLAUTO--,/*ELEMENTS,*/--XMLDATA”。
2.缺少根元素
错误信息:
执行发送管道时出错:“Microsoft.BizTalk.DefaultPipelines.XMLTransmit, Microsoft.BizTalk.DefaultPipelines, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”,源:“XML 组装器”,发送端口:“SendPort_DataToXXX”,URI:“C:/Messages/Test/Create/%MessageID%.xml”,原因: 缺少根元素。
解决方法:
出现这种问题最大的可能性是在生成输出的Xml文件时出错导致格式错误。在使用BizTalk过程中使用架构映射文件(.btm)进行xml变换时会遇到这个问题。解决办法就是确认源架构文件(.xsd)和目标架构文件设置的目标命名空间是否正确。通过在vs.net的解决方案资源管理器的btm文件上点击右键菜单选择属性进行输入输出的设置,再通过右键菜单进行“测试映射”或“验证映射”来检查正确性。
3.重新部署BizTalk应用程序无法刷新服务器运行实例
描述信息:
对BizTalk Server应用程序项目修改后通过vs.net2005进行重新部署到BizTalk服务器,结果BizTalk应用程序无法刷新服务器运行实例,还是运行上一个版本的程序。
解决方法:
a.在重新部署修改后的应用程序前,必须先停止BizTalk Server上的对应用程序实例。
b.通过vs.net部署程序。
c.在BizTalk Server 2006的管理器里的组节点下面的应用程序节点右键点击刷新菜单。
d.打开系统服务管理器找到“BizTalk Server 应用程序服务”,对其进行重新启动。
e.在BizTalk Server 2006的管理器中启动部署的应用程序。
4.在vs.net 2005中无法自动刷新程序集引用
描述信息:
在vs.net 2005中,对被引用程序集的修改,无法在引用它的项目中进行自动刷新。
解决方法:
5.验证架构文件(.xsd)出现错误 BEC2004
错误信息:(VS2005输出的错误信息有点读不通)
C:/测试目录/EntryDatasingle.xml: 错误 BEC2004: 元素 命名空间“http://namespace-url”中的“[xml根目录]”。 的子元素 命名空间“http://namespace-url”中的“ENTRY_CONTAINER”。无效。应为可能元素的列表: “某个子元素”。
解决方法:
在VS.net中打开架构文件,选中<Schema>,在属性窗口中。设置Element FormDefault值为Qualified,设置Attribute FormDefault值为Unqualified。详细可以访问http://blog.csdn.net/zhzuo/archive/2006/08/02/1011031.aspx。
6.通过vs.net部署应用项目提示“无法添加资源”
错误信息:
无法添加资源。 存储区中已存在资源(-Type=“System.BizTalk:BizTalkAssembly” -Luid=“BizTalkTestProject1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3a57bb41dbe2b5dc”),并且该资源与另一个应用程序或另一种类型相关联。
解决方法:
在vs.net中打开BizTalk浏览器,找到前次部署的应用程序对应的程序集,右键点击取消部署,再次通过vs.net进行部署操作。
7.只能在原子作用域或服务中声明非序列化对象类型
错误信息:
只能在原子作用域或服务中声明非序列化对象类型“System.Xml.XmlNodeList XmlEntryDataNodeList” E:/vs2005projects/BizTalk2006Projects/BiztalkTestSolution/SqlMQTest/SendEntryXXXProcess.odx
解决办法:
一种方式是把非序列化对象类型定义到原子作用域中,另一种方式设置事务类型为无或把整个编排事务类型设置为原子。
8.消息引擎无法从数据库检索配置。详细信息:“c0002a1f”
错误信息:
消息引擎无法从数据库检索配置。详细信息:“c0002a1f”。
解决办法:
可能的原因,数据库访问出现问题。未仔细确认,最终解决方案是重新安装BizTalk Server。
9.日志项字符串太长。写入事件日志的字符串不能超过 32766 个字符
错误信息:(错误日志比较长,列出一部分)
未捕获的异常(请参阅下面的“内部异常”)已经挂起服务
内部异常: 日志项字符串太长。写入事件日志的字符串不能超过 32766 个字符。
异常类型: ArgumentException
源: System
目标站点: Void InternalWriteEvent(UInt32, UInt16, System.Diagnostics.EventLogEntryType, System.String[], Byte[], System.String)
解决办法:
出现这种情况可能的原因是接收适配器一次性获取的数据量太大。笔者测试通过SQL适配器接收2500条记录在业务编排中处理时出现该问题。设置数据量在100条运行恢复正常。
10.BizTalk Server 2006安装问题
安装文档:
11.设置MQSeries传输属性的队列定义,队列管理器失败
错误信息:
从计算机192.168.0.10为 CLSID为 {86E96D72-0011-4B28-B1AC-BF52AB47F1B4}的远程组件检索COM类工厂失败,原因出现以下错误:80070005。
解决办法:
12.非法尝试更新消息“Message_XXX”的只读属性值
错误信息:
未捕获的异常(请参阅下面的“内部异常”)已经挂起服务“BizTalkServer2006Test.SendNbEportEntryDataProcess(614fa04f-8968-ef95-952b-11c74450b870)”的一个实例。在管理性地恢复或终止该服务实例前,它将保持挂起状态。如果恢复了该服务实例,它将从上次持续的状态继续,这可能再次引发同样的异常。实例 ID: 7f064588-f7a1-4dc0-b7f7-180163b04b61
形状名称: Construct_SendData形状 ID: c5e435bc-cbbb-48b5-89df-a97ebe0fbee4引发异常的位置: 段 2,进程 15内部异常: 非法尝试更新消息“Message_SendNbEport”的只读属性值(名称:“http://schemas.microsoft.com/BizTalk/2003/system-properties”、命名空间:“MessageID”)。
异常类型: PropertyUpdateDisallowedException
源: Microsoft.XLANGs.Engine
目标站点: Void ReadonlyPropertySetter(Microsoft.XLANGs.Core.XMessage,Microsoft.XLANGs.BaseTypes.XmlQName, System.Object)
解决办法:
该错误为修改只读的MessageID属性引起,修改设置该属性的代码。比如下面的例子。
Message_XXX(BTS.MessageID) = System.DateTime.Now.ToString("yyyyMMddHHmmss");
13.使用SQL适配器发送数据提示“新事务不能登记到指定的事务处理器中”
错误信息:
适配器无法传输要发往发送端口“SendPort_InsertList”(URL 为“SQL://192.168.0.2/H_IMS_RECV/”)的消息。在为该发送端口指定的重试时间间隔过后,将会重新传输该消息。详细信息:“新事务不能登记到指定的事务处理器中。 ”。
解决办法:
14.分步启动BizTalk Server 2006应用程序出错
错误信息:
提示部分依赖项没有启动等信息。
解决办法:
先启动发送端口,再启动业务流程,最后启动接收位置。
15.添加SQL适配器元数据提示“无法执行SQL语句。请确保提供的语法正确。”
错误信息:
在点击BizTalk项目右键菜单中选择->添加->添加生成的项->添加适配器元数据启动添加适配器向导。在SQL传输架构生成向导对话框中选择存储过程,点击生成按钮后,单击下一步按钮出现“无法执行SQL语句。请确保提供的语法正确。新事务不能登记到指定的事务处理器中。”的错误信息。
解决办法:
可能的一种情况是在添加的元数据端口类型为“接收端口”时,选择的存储过程没有返回架构元数据。可以修改该存储过程对SELECT语句加上“FORXMLAUTO/*,LEMENTS*/,XMLDATA”语句使其返回元数据,在生成后再去掉该语句。
16.添加SQL适配器元数据提示“无法执行SQL语句。请确保提供的语法正确。新事务不能登记到指定的事务处理器中。”
错误信息:
在点击BizTalk项目右键菜单中选择->添加->添加生成的项->添加适配器元数据启动添加适配器向导。在SQL传输架构生成向导对话框中选择存储过程,点击生成按钮后,单击下一步按钮出现“无法执行SQL语句。请确保提供的语法正确。新事务不能登记到指定的事务处理器中。”的错误信息。
解决办法:
17.在基于内容的消息路由中提示“无法路由发布的消息,因为找不到订户”
错误信息:
错误详细信息: 无法路由发布的消息,因为找不到订户。如果订阅业务流程或发送端口尚未登记,或者订阅评估必需的某些消息属性尚未升级,就会出现此错误。请使用 Biztalk 管理控制台排除此故障。
解决办法:
可能的解决办法,在没有使用业务流程编排的项目中,在发送端口的筛选器设置,
属性:BTS.ReceivePortName
运算符:==
值:[接收端口名称]
分组依据:与
18.执行接收管道时出错,没有任何 拆装 阶段组件可识别该数据
错误信息:
接收位置“Receive Location1”(URI 为“E:/test/test_Input/*.*”)上的适配器“FILE”接收的消息已挂起。错误详细信息: 执行接收管道时出错:“Microsoft.BizTalk.DefaultPipelines.XMLReceive, Microsoft.BizTalk.DefaultPipelines, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”,源:“XML 拆装器”,接收端口:“ReceivePort1”,URI:“E:/test/test_Input/*.*”,原因: 没有任何 拆装 阶段组件可识别该数据。
解决办法:
在接收文件目录中放入一个非xml文件,在接收端口中设置拆装器为“Microsoft.BizTalk.DefaultPipelines.XMLReceive”所导致,如果是处理平文件,调整接收管道为“Microsoft.BizTalk.DefaultPipelines.PassThruReceive”。如果是xml文件,检查xml格式是否有误。
19.执行发送管道时出错,原因: 根级别上的数据无效
错误信息:
执行发送管道时出错:“Microsoft.BizTalk.DefaultPipelines.XMLTransmit, Microsoft.BizTalk.DefaultPipelines, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”,源:“XML 组装器”,发送端口:“SendPort1”,URI:“E:/[测试报文]/预定数据到分中心/test_Output/%SourceFileName%”,原因: 根级别上的数据无效。 行 1,位置 1。
解决办法:
同第17个问题相似,在发送端口中发送管道的设置的问题,如果是处理平文件,调整发送管道为“Microsoft.BizTalk.DefaultPipelines.PassThruTransmit”。如果是xml文件,检查xml格式是否有误。
20.配置MQSeries适配器的队列定义信息选择本地服务器队列管理器出错
错误信息:
服务器 localhost 上未安装或未正确配置适配器。COM异常:从计算机localhost为CLSID为{86E96D72-0011-4B28-B1AC-BF52AB47F1B4}的远程组件检索COM类工厂失败,原因是出现以下错误:80040154。
解决办法:
确认是否运行过BizTalk MQSeries 代理配置向导,如果没有通过开始菜单->程序->Microsoft BizTalk Server 2006->BizTalk MQSeries 代理配置向导来进行设置。另外需要注意MSDTC的安全配置,以Windows Server 2003为例,在开始菜单的运行中输入dcomcnfg命令打开组件服务控制台,展开左边的组件服务下面的计算机、我的电脑右键菜单属性选择MSDTC选项卡,点击安全配置按钮,调整安全配置,具体的配置可以看http://blog.csdn.net/zhzuo/archive/2006/07/07/890030.aspx。
21.通过MQSeries适配器发送消息提示访问被拒绝
错误信息:
适配器无法传输要发往发送端口“SendPort1”(URL 为“MQS://localhost/nbeport_zz_test/zz_test_queue”)的消息。在为该发送端口指定的重试时间间隔过后,将会重新传输该消息。详细信息:“The adapter has encountered an 'Access Denied' error while attempting to contact the COM+ object on the MQSeries server. Ensure the BizTalk account is added to the Role on the MQSAgent COM+ application.”。
解决办法:
以Windows 2003 Server为例,在开始菜单的运行中输入dcomcnfg命令打开组件服务控制台,展开左边的组件服务下面的计算机->我的电脑->COM+ 应用程序->MQSAgent2->角色->CreatorOwner->用户->右键菜单新建->用户->添加BizTalk Server Administrators组用户和BizTalk Application Users组用户。返回到MQSAgent2节点右键->禁用->启用->启动。如果还是出现问题请重新启动计算机。具体的配置可以看http://blog.csdn.net/zhzuo/archive/2006/07/07/890030.aspx。
22.在应用程序日志中出现“文件系统连接器中发生错误”
错误信息:
文件系统连接器中发生错误。请查看详细信息。Cant make a connection to //Test-11/EDIDocsHome/Documents/PickupEDI. Errormessage: The operation cannot be performed because a network component is not started or because a specified name cannot be used.Foldername: //NBEPORT-MQ/EDIDocsHome/Documents/PickupEDI, Errormessage: The operation cannot be performed because a network component is not started or because a specified name cannot be used.
解决办法:
该问题为访问PickupEDI目录权限不够引起,可以设置目录属性的安全来解决。
23.使用Sql适配器调用存储过程出现“HRESULT="0x80004005" Description="事务与另一个进程被死锁在锁资源上,并且已被选作死锁牺牲品。请重新运行该事务。
错误信息:
适配器无法传输要发往发送端口“SendPort_SendHead_Sql”(URL 为“SQL://localhost/testDb/”)的消息。在为该发送端口指定的重试时间间隔过后,将会重新传输该消息。详细信息:“HRESULT="0x80004005" Description="事务(进程 ID 103)与另一个进程被死锁在锁资源上,并且已被选作死锁牺牲品。请重新运行该事务。"
”。
解决办法:
根据以上链接地址提供的处理方式,笔者没有完全解决问题。下面是补充:在应用程序的发送端口属性中,选择“传输高级选项”卡,选中“按序到达”复选框。对于“当前消息失败后停止发送随后的消息”子复选框看具体情况而定。通过以上设置问题解决。笔者认为产生这个的原因会很多,多个应用程序访问同一数据库同一表,如果处理不当,造成死锁,就会出现该问题。笔者认为此类解决问题的关键还是在Sql语句或存储过程对表的访问是否设计的合理,并不是BizTalk Server 单个系统可解决。
24.SQL Server Scheduled Job 'TrackedMessages_Copy_BizTalkMsgBoxDb'失败
错误信息:
SQL Server Scheduled Job 'TrackedMessages_Copy_BizTalkMsgBoxDb' (0xE0586DA84D856C4FB003C5FC5405EDF4) - Status: 失败 - Invoked on: 2006-08-30 15:39:00 - Message: 该作业失败。 计划 7 (Schedule) 调用了该作业。最后运行的是步骤 1 (Purge)。
解决办法:
查看计划任务执行的的语句为“exec bts_CopyTrackedMessagesToDTA '计算机名', 'BizTalkDTADb'”。查看错误记录,提示需要添加指定的SqlServer服务器为链接服务器。由于笔者使用的系统BizTalk应用服务器同Sql Server 2005服务器安装在同一台服务器上,结果提示变成为把本机添加到链接服务器,是不是很奇怪?通过Sql Server 2005的“服务器对象”节点无法添加本地服务器到链接服务器。于是执行添加链接服务器的存储过程(master.dbo.sp_addlinkedserver),结果不行,同事在本地添加一个异地链接服务器,然后通过“编写链接服务器脚本为”菜单导出链接服务器脚本,对生成的脚本修改服务器名,在BizTalk所在的服务器上执行,结果添加成功。问题解决,计划任务运行正常。笔者再次访问“服务器对象”节点时,看到新添加的本机服务器,查看该属性,在选项页中,无法查看“安全性”和“服务器选项”,提示“您不能将本地SQL Server 创建为链接服务器”。难道是bug?
25.未能加载文件或程序集,系统找不到指定的文件
错误信息:
未捕获的异常(请参阅下面的“内部异常”)已经挂起服务“H2KSubscription.Orchestrations.H2KSubscriptionOrchestration(56e2103c-6fbb-1ae7-090b-2ad857498bd5)”的一个实例。
在管理性地恢复或终止该服务实例前,它将保持挂起状态。
如果恢复了该服务实例,它将从上次持续的状态继续,这可能再次引发同样的异常。
内部异常: 未能加载文件或程序集“NbEport.BizTalk, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5fe699727ca8b4b6”或它的某一个依赖项。系统找不到指定的文件。
异常类型: FileNotFoundException
源: Customs.H2KSubscription
目标站点: Microsoft.XLANGs.Core.StopConditions segment1(Microsoft.XLANGs.Core.StopConditions)
解决办法:
这是由于调用的外部组件没有加载到BizTalk应用程序,检查所在应用程序的资源节点,添加“NbEport.BizTalk”组件,确认在.NET全局程序集中是否存在该组件,如果没有需要添加到全局程序集。