接触biztalk时间不长,转载一篇学习教程:
http://www.cnblogs.com/chnking/archive/2010/05/09/1731098.html
chnking写的。
一、 使用WCF_SQL、WCF_Oracle、WCF_SAP
adapter的公共安装前提
1、
Microsoft
.NET Framework 3.5 SP1.
2、
Microsoft
Visual Studio 2008
3、
安装WCF
LOB Adapter SDK SP2
要在VS2008中使用BizTalk Adapter Pack
2.0中的适配器开发biztalk项目,必须在安装WCF
LOB SDK时选择安装BizTalk
add-in for Visual Studio。要安装此add-in,必须使用定制安装或完全安装WCF LOB Adapter SDK。
在定制安装的选项中,选择BizTalk Server Addin。并且在安装WCF
LOB Adapter SDK前,VS2008必须已经安装。
4、
安装BizTalk
Adapter Pack 2.0
(先安装BizTalk
Adapter Pack 2.0,再WCF
LOB Adapter SDK,最好完全安装)
二、 使用WCF_SQL
adapter
这里使用一个例子来说明如何使用WCF_SQL adapter。
1、
例子场景
系统A有个雇员表Employees,结构如下:
字段 |
类型 |
说明 |
ID |
int |
自增长id |
Name |
nvarchar(50) |
姓名 |
Age |
int |
年龄 |
Gender |
int |
性别 |
New |
bit |
是否新增 |
当有新雇员加入到此表,New字段先置为1,表示是新增的雇员。这张雇员表要传到系统B的雇员表EmployeesTarget,表结构跟上面的雇员表一样,只是少了New字段。
Biztalk要做的是使用WCF_SQL
adapter读取系统A的雇员表Employees中的新增雇员,同时将New字段置为0,然后将新增的雇员写入到系统B的雇员表EmployeesTarget里。
2、
接收位置
2.1.
准备获得数据的存储过程
在系统A中建一个读取新雇员的存储过程:
ALTER PROCEDURE [dbo].[GetEmployees]
AS
BEGIN
--获取所有新增用雇员的记录
select
Name,Age,Gender from
dbo.Employees where New=1
--将所有新增雇员的New字段置为0
update
dbo.Employees set New=0 where New=1
END
2.2.
使用向导获得接收数据的schema
下面在VS2008中新建接收新增雇员的schema,在VS2008的biztalk项目上点击右键,选择“添加生成项”:
选择“Consume Adapter
Service”:
在Select a binding下选择“sqlBinding”,使用WCF_SQL
adapter。
点击右上方的“Configure”按钮:
配置要连接sql server的用户名和密码。
在URI Properties标签里如下设置:
Server
– 设置要连接的sql
server名或IP
InitialCatalog
– 要连接的数据库名
InboundId
– 接收位置的序号
Binding
Properties标签中:
作为接收端口,访问数据库采用轮训机制,就是按一定的时间间隔定时读取数据库。
InboundOperationType--属性有几种类型可选:Polling,TypedPolling,Notification。
Polling是轮询方式,但是这种方式是不带架构的,TypedPolling也是轮询方式,这种方式可以带出架构。Notification是用于数据有变化时进行相关通知。
如果需要轮询数据,又要能刷出数据架构,需要采用TypedPolling方式。
PollingIntervalInSecond – 轮询间隔时间
PolledDataAvailableStatement – 执行轮询的条件,这里一般是个select语句,这条语句应该返回一个单个的结果集,只要这个结果集的第一行第一列必须有值(如果是空结果集会报错),应该是个大于等于0的整数值。如果这个值大于0则执行下面PollingStatement指定的sql命令真正的开始轮询的操作。如果这个值等于0,则轮询语句不执行。
这个例子中可以设置为:select 1 from dbo.Employees where
new=1
PollingStatement – 轮询命令,可以是sql语句,也可以是存储过程。
这个例子中可以设置为:exec dbo.GetEmployees
(note:binding
Properties 标签中:useambienttransaction
这个值一定要是:false,不然最后运行的时候会报以下错误日志:)
适配器“WCF-SQL”返回一条错误消息。详细信息为“System.ObjectDisposedException:
无法访问已释放的对象。
对象名:“TransactionScope”。
在
System.Transactions.TransactionScope.Complete()
在
System.ServiceModel.Dispatcher.TransactionRpcFacet.ThreadLeave()
在
System.ServiceModel.Dispatcher.TransactionBehavior.ClearCallContext(MessageRpc&
rpc)
在
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage7(MessageRpc&
rpc)
在
System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean
isOperationContextSet)”。
Configure
Adapter完成后,回到adapter设置主界面:
点击Connect按钮,如果在Configure中连接信息设置没问题,连接状态将会显示:已连接。
要作为接收端口,biztalk相当于服务端,所有在Select contract type要选择Service(Inbound
Operations)
在选择了Service(Inbound Operations)时,在下边的Select
a Category中一定是空的(除了那个省略号和斜杠),别无选择,点击这个斜杠。
在右边会出现三个可选的操作Polling,TypedPolling,Notification,他们的含义前面已经说过了。选择TypedPolling,点击“Add”按钮。
OK,完成向导。
可以看到在项目中生成了两个文件,一个是根据前面设置的轮询命令生成的schema,一个是可以导入到biztalk的接收位置和端口的绑定文件,可惜的是,向导生成的绑定文件都是使用的WCF_Custom的绑定而不是希望的WCF_SQL的绑定。所以这个例子里不使用向导生成的绑定文件。
看一下生成的schema:
跟前面的存储过程比较一下,可以发现生成的schema就是存储过程返回的那三个字段,说明向导刷到了存储过程的schema。
这跟非WCF的sql
adapter不同,非WCF的sql
adapter返回数据时必须使用for
xml auto,xmldata返回架构,adapter向导才能刷出架构。WCF_SQL则不必,一般的select返回的结果集就可以直接刷出架构。
2.3.
配置物理接收位置
物理接收位置的配置几乎跟向导中的设置一模一样。
2.3.1.
General
2.3.2.
Binding
(配置物理接受位置在BIZTALK管理配置接受端口,useambienttransaction
这个值一定要是:false,在“other”选项里,选择用户帐户,接受管道要选择为:XMLReceive)
3、
发送端口
发送端口就是要把接收端口接收进来的新增雇员数据写入到另一张雇员表(B系统)。
(以下操作都是在B系统,另一台机器的数据库 )
3.1.
准备用户定义的表类型
发送到系统B的新雇员数据是一张可能有多条数据的雇员表,需要把数据表作为参数传送给存储过程。所以需要定义一个雇员表结构的用户定义的表类型:
CREATE TYPE [dbo].[UD_Employess] AS
TABLE(
[Name]
[nvarchar](50) NULL,
[Age] [int] NULL,
[Gender] [int] NULL
)
在sql server management
studio中可以看到这个定义的用户定义表类型。有了这个表类型,就可以向存储过程传送雇员表了:
3.2.
准备更新雇员数据的存储过程
使用前面定义的用户定义表类型作为输入参数,新建一个向系统B写入新雇员数据的存储过程:
ALTER PROCEDURE [dbo].[UpdateEmployees]
@EmployessTable
dbo.UD_Employess READONLY
AS
BEGIN
insert
into dbo.EmployeesTarget (Name,Age,Gender)
select
Name,Age,Gender from
@EmployessTable
END
3.3.
使用向导获得发送数据的schema
下面开始使用向导生成调用UpdateEmployees存储过程的schema。
同样是在VS2008的biztalk项目上点击右键,选择“添加生成项”,Consume Adapter
Service,弹出添加适配器向导窗口中选择“sqlBinding”。
在设置好登陆用户名和密码,要连接的服务器和数据库,在Configure Adapter的Binding
Properties标签中不需要跟接收端口时一样,这里不需要在绑定属性中做前面的设置。
直接回到adapter设置主界面:
连接数据库,前面设置正确的话,连接状态会显示为:已连接。
发送端口应该选择“Client(Outbound operations)”,这时在下面会出现可以选择指定数据库的发送端口可用的资源。为了能刷出架构,这里选择“Strong-Typed Procedure”,在右边显示出指定数据库所有的存储过程,这里选择[dbo].[UpdateEmployees],这是往系统B插入新雇员的存储过程。
OK,完成向导。
可以看到在项目中生成了三个文件,TableType.dbo.xsd是UpdateEmployees使用的用户定义表类型输入参数生成的schema,一个是UpdateEmployees存储过程生成的schema,一个是可以导入到biztalk的发送端口的绑定文件:
看一下TableType.dbo.xsd用户定义表类型的schema:
可以看出这个架构就是前面定义的UD_Employess表类型的结构。
3.4.
配置物理发送端口
新建一个WCF_SQL的发送端口,配置这个端口。
3.4.1.
General
在Configure中配置要连接的sql server服务器和数据库。
SOAP
Action指定要访问的这个数据库的哪个存储过程,Action的具体值可以在向导生成的绑定文件中找到:
3.4.2.
Credentials
在Credentials标签中输入访问sql server的用户名和密码:
(
(配置物理发送端口在BIZTALK管理配置发送端口,useambienttransaction
这个值一定要是:false,在“other”选项里,选择用户帐户,发送管道要选择为:XMLTransmit)
)
4、
流程设计
流程很简单,从系统A通过WCF_SQL接收端口接收新雇员的消息,mapping成发送到系统B的消息,然后发送到系统B:
Mapping为:
/Files/qipilang/BizTalkWCFSQL.rar
项目程序
在做这个教程的时候,遇到几个问题:
1.用vs打开biztalk的时候,需要用管理员权限打开,否则编译的时候,会报一些拒绝访问。
2. 在运行biztalk出现以后,先去“Windows事件日志”中查找出错误,如果事件日志中没有错误,再去biztalk
group,查看”挂起的服务实例“。查找原因。
3.最好把biztalk中业务流程,接受端口,发送端口的跟踪全部打开,这样可以在biztalk
group“跟踪消息事件”查看各个端口,是那个端口出的错等信息。
4. 做的过程中,事件日志报这个一个错:
在基于内容的消息路由中提示“无法路由发布的消息,因为找不到订户”
错误信息:
错误详细信息:
无法路由发布的消息,因为找不到订户。如果订阅业务流程或发送端口尚未登记,或者订阅评估必需的某些消息属性尚未升级,就会出现此错误。请使用 Biztalk
管理控制台排除此故障。
解决办法:
可能的解决办法,在没有使用业务流程编排的项目中,在发送端口的筛选器设置,
属性:BTS.ReceivePortName
运算符:==
值:[接收端口名称]
分组依据:与