montaque

小碗喝酒,小口吃肉

博客园 首页 新随笔 联系 订阅 管理

在biztalk 2006 R2中,EDI做了很大的加强。其中之一就是Party的识别算法和 EDI 由 Adpater 移到Pipeline中。

EDI 的schema在Biztalk R2中很大,C:\Program Files\Microsoft Biztalk Server\XSD_Schema\EDI 下面有一个压缩文件。加压后大概有4G多。

一把来说,你用哪个,把对应的schema从中加压出来。然后修改之,达到你想要的效果。一来默认的schema非常大,一个schema可能有5M左右,编译成Dll 翻倍,10M。 而.net assembly的大小不能大于75M,所以一般来说一个Dll只能包含5个左右的Schema。

这个时候,你就要小心剪辑你的Schema文件。

比如我有一个810 invoice的文件。如下,接下来我们一步一步的配置Biztalk ,解析成xml文件。这个EDI是版本00401,810.

ISA*00*          *00*          *01*Fedex          *ZZ*Montaque       *070607*1555*U*00401*000000025*0*T*>~
GS*IN*Fedex*Montaque*20070607*1555*25*X*004010~
ST*810*0025~
N1*SF*COMPANY X~
N3*P.O. BOX 12345~
N4*ANYTOWN*OH*45678~
IT1*1*0.528*TS*1.13**VP*1AGHA1223221~
CTT*1~
SE*7*0025~
GE*1*25~
IEA*1*000000025~

 

我们首先从schema压缩包中解压缩这个文件。

image

新建一个Biztalk的项目,把这个schema 添加进去。

image

这个schema还好1M多,接下来我们剪辑一下。假定Fedex给我们的文件,只需要ST,Nloop,CTT

我们把其他的都删除,你可以ctl多选或者shifit所中所有的节点。删除之,把他瘦身一下。

image

Biztalk是通过schema的TargetNamespace和RootElement来区分不同的schema。由于这个schema我们是专门针对Fedex的,所以不能直接部署到biztalk。我们把他的namespace有

http://schemas.microsoft.com/BizTalk/EDI/X12/2006

改为

http://schemas.microsoft.com/BizTalk/EDI/X12/2006/Fedex

image

然后选择项目属性,给他一个AssemblyKey,部署到EDIDemo这个Application中。然后点击部署

此时可以看到EDIDemo中有我们剪切好的Schema

image

 

Biztalk R2如果你Enable EDI的话,会默认帮你新建一个Biztalk EDI Application

用于处理EDI的系统Schema,Pipeline,等对象都在这个Application中。

默认我们的EDiDemo中并没有EDISend和EDIReceive的Pipiline

image

接下来右键EDIDemo Application,选择Add->Reference,EDI Application.这时候你就可以使用这些pipeline了。

我们首先新建一个Static one-way ReceivePort叫做 ReceivePort1

然后新建一个receivelocation,选择FileAdapter,PipeLine选择EDiReceive

image

然后Enable这个ReceiveLocation。

 

接着建立一个SendPort,设置一个Filter,如果从ReceivePort1来的消息,直接发出去。

image

设置一个Filter,这样不同写Orchastration来订阅这个消息。

 

image

这时候先Enlist这个sendport,注意不要Enable。为了调试方便。这样的话,你就可以看到将要发出什么消息出来。

 

这时候我们就可以发消息了。 把我们写好的EDI文件,Copy一份到接受目录。

这时候不巧,消息并没有出来。看一下系统日志,有个错误。错误如下:


Error encountered during parsing. The X12 transaction set with id '' contained in functional group with id '25', in interchange with id '000000025', with sender id 'Fedex          ', receiver id 'Montaque       ' is being suspended with following errors:

Error: 1 (Miscellaneous error)
    6: Missing or invalid or duplicate Transaction set identifier 'http://schemas.microsoft.com/BizTalk/EDI/X12/2006#X12_00401_810'

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

意思是说我们没有指定TransactionSet,这里的The X12 transaction set with id ''  id是空。哪里出错了呢?

接下来我们用Cordbg调试一下,一般来说在Biztalk里面使用EDI,很容易出这样那样的错误。尤其是EDI,出错了之后错误日志很模糊,由于Biztalk是个典型的.net application,我们可以通过查看异常的StackTrace,看到底发生什么了。

run Cordbg

Ca e

a [Biztalk的Process]

g

这时候再丢一个文件进去。cordbug就看到错误了。run De,退出调试,让程序直接走。

image

意思是说EDI的Pipeline,试图用://schemas.microsoft.com/BizTalk/EDI/X12/2006#X12_00401_810 来解析这个消息。可是这个schema并没有部署。为什么呢? 我们改了schema的namespace。 后面我会讲EDI得schema识别算法

EDI 有四种算法来解析改用那个schema。我们什么都没有设置,所以shema是由Global EDI Setting设置的

打开Party下面,右键Global EDI setting

image

果然,他设置的还是旧的那个Schema。我们把它改一下

改为 http://schemas.microsoft.com/BizTalk/EDI/X12/2006/Fedex

reboot一下Biztalk Service

然后确认,再丢一个消息进去。

打开biztalk的管理界面,查看一下suspended instance

就可以看到系统将要发出去的消息

image

你可以双击查看消息的明文

image

右键,resume这个instance。

image

然后接看到文件被发出来了。

image

 

当然这个只是一个Demo。可以写一个流程来处理该消息,比如写入数据库等。

我们剪切了一个Schema,针对一个vendor Fedex。然后配置了全局都使用这个schema。事实上可以配置Party,不同的party使用针对他们的schema

后面继续讲。

posted on 2008-05-30 01:32  montaque  阅读(2052)  评论(1编辑  收藏  举报