none
BTS信封使用困惑! RRS feed

  • 问题

  •  

     

     Envelope.xsd

    Envelope

       <Any>

     

    /*[local-name()='Envelope' and namespace-uri()='http://TestEnvelope.Envelope']

     

    Schema1.xsd

    EnvelopeRoot

       a

        b

    -----------------------------------------------------

    以Schema1.xsd生成的instance 测试该信封

    <ns0:EnvelopeRoot xmlns:ns0="http://TestEnvelope.Envelope">
      <ns0:a />
      <ns0:b />
    </ns0:EnvelopeRoot>

    结果抱错

    Reason: No Disassemble stage components can recognize the data.

    ---------------------------------------------------------

    手动修改消息如

    <ns0:Envelope xmlns:ns0="http://TestEnvelope.Envelope">
      <ns0:EnvelopeRoot>
        <ns0:c />
        <ns0:b />
      </ns0:EnvelopeRoot>
      </ns0:Envelope>

    测试OK!!!

    --------------------------------------------------------

    修改Schema1.xsd

     Envelope

         EnvelopeRoot

             a

             b

    重新编译部属

    并生成新的instance

    测试报错

    Reason: Cannot locate document specification because multiple schemas matched the message type

    -----------------------------------------------------------------------------------------------------

    信封架构与消息架构 该如何修改 对应?

     

     

    2008年10月29日 2:07

答案

  • 这样的信封:

    Code Snippet

    <Envelope xmlns="http://TestEnvelope.Envelope">

      <Any>

    </Envelope>

     

    除了<any>部分的内容都是属于信封的内容,biztalk收到消息后,先跟信封的消息类型匹配,匹配到后,将信封拆掉,剩下<any>部分的内容,这部分的内容是放入信封的任意的xml内容,一般是一个消息schema的多个xml实例,biztalk会把这多个xml实例拆成单个的独立的消息。

    比如放在信封中的完整消息是这样:

    Code Snippet

    <ns0:Envelope xmlns:ns0="http://TestEnvelope.Envelope">
      <ns0:EnvelopeRoot>
        <ns0:c>1</ns0:c>
        <ns0:b>2</ns0:b>
      </ns0:EnvelopeRoot> 
      
      <ns0:EnvelopeRoot>
        <ns0:c>3</ns0:c>
        <ns0:b>4</ns0:b>
      </ns0:EnvelopeRoot>  

      <ns0:EnvelopeRoot>
        <ns0:c>5</ns0:c>
        <ns0:b>6</ns0:b>
      </ns0:EnvelopeRoot> 

     </ns0:Envelope>

     

    biztalk会先把最外层的信封Envelope元素拆掉,拆成三个:

    Code Snippet
      <ns0:EnvelopeRoot xmlns:ns0="http://TestEnvelope.Envelope">
        <ns0:c>1</ns0:c>
        <ns0:b>2</ns0:b>
      </ns0:EnvelopeRoot>

     

    这样的独立消息。

     

    最后,每个独立的消息再跟已部署的schema匹配,如果有没有匹配到的就会报错。

     

     

     

     

     

     

    2008年10月29日 6:16

全部回复

  • 这样的信封:

    Code Snippet

    <Envelope xmlns="http://TestEnvelope.Envelope">

      <Any>

    </Envelope>

     

    除了<any>部分的内容都是属于信封的内容,biztalk收到消息后,先跟信封的消息类型匹配,匹配到后,将信封拆掉,剩下<any>部分的内容,这部分的内容是放入信封的任意的xml内容,一般是一个消息schema的多个xml实例,biztalk会把这多个xml实例拆成单个的独立的消息。

    比如放在信封中的完整消息是这样:

    Code Snippet

    <ns0:Envelope xmlns:ns0="http://TestEnvelope.Envelope">
      <ns0:EnvelopeRoot>
        <ns0:c>1</ns0:c>
        <ns0:b>2</ns0:b>
      </ns0:EnvelopeRoot> 
      
      <ns0:EnvelopeRoot>
        <ns0:c>3</ns0:c>
        <ns0:b>4</ns0:b>
      </ns0:EnvelopeRoot>  

      <ns0:EnvelopeRoot>
        <ns0:c>5</ns0:c>
        <ns0:b>6</ns0:b>
      </ns0:EnvelopeRoot> 

     </ns0:Envelope>

     

    biztalk会先把最外层的信封Envelope元素拆掉,拆成三个:

    Code Snippet
      <ns0:EnvelopeRoot xmlns:ns0="http://TestEnvelope.Envelope">
        <ns0:c>1</ns0:c>
        <ns0:b>2</ns0:b>
      </ns0:EnvelopeRoot>

     

    这样的独立消息。

     

    最后,每个独立的消息再跟已部署的schema匹配,如果有没有匹配到的就会报错。

     

     

     

     

     

     

    2008年10月29日 6:16
  •  

    结合我的例子

    该如何修改呢?

    2008年10月29日 6:26
  • 上面给的就是结合你里例子的
     
    这是信封架构:

    <Envelope xmlns="http://TestEnvelope.Envelope">

      <Any>

    </Envelope>

     
    这是消息架构:
      <ns0:EnvelopeRoot xmlns:ns0="http://TestEnvelope.Envelope">
        <ns0:c>1</ns0:c>
        <ns0:b>2</ns0:b>
      </ns0:EnvelopeRoot>
     
    这是三个同类消息放入到信封后的:

    <ns0:Envelope xmlns:ns0="http://TestEnvelope.Envelope">
      <ns0:EnvelopeRoot>
        <ns0:c>1</ns0:c>
        <ns0:b>2</ns0:b>
      </ns0:EnvelopeRoot> 
      
      <ns0:EnvelopeRoot>
        <ns0:c>3</ns0:c>
        <ns0:b>4</ns0:b>
      </ns0:EnvelopeRoot>  

      <ns0:EnvelopeRoot>
        <ns0:c>5</ns0:c>
        <ns0:b>6</ns0:b>
      </ns0:EnvelopeRoot> 

     </ns0:Envelope>

    2008年10月29日 6:31
  •  

    你给的例子

    与我的原贴

     

    手动修改消息如

    <ns0:Envelope xmlns:ns0="http://TestEnvelope.Envelope">
      <ns0:EnvelopeRoot>
        <ns0:c />
        <ns0:b />
      </ns0:EnvelopeRoot>
      </ns0:Envelope>

    测试OK!!!

     

    中是一样的

    是可以通过

     

    但该消息的 Envelope 根元素是

    是手动添加上去的

    无法通过Schema自动生成

     

    我意思是如何Schema自动生成的消息

    可以被拆开 通过

    2008年10月29日 6:35
  •  

    例如

    从接受位置接受的Message

    肯定是根据该Message 制订ENVELOP

    自动拆分Message

    而不会要手动添加什么根接点吧

    2008年10月29日 6:37
  • 信封和消息是两个不同的schema,不能自动生成一个装入信封的消息实例,需要通过一定的方式把他们组合起来。
    比如sql adapeter就能把多条记录组成成适合信封的形式。
    2008年10月29日 6:40
  •  

    我知道envelp schema 与 message schema 是不同的 独立的两个

     

    我意思是

    预待拆的消息 肯定要符合 其message schema

    而 envelop schema 和message schema  肯定是有某些层阶对应或联系

    具体到我说的例子

    现在出现的矛盾是

    1 符合message schema 的消息 不能被拆分

    而会抱错

    必须要手动添加根元素 才通过

     


    手动修改消息如

    <ns0:Envelope xmlns:ns0="http://TestEnvelope.Envelope">
      <ns0:EnvelopeRoot>
        <ns0:c />
        <ns0:b />
      </ns0:EnvelopeRoot>
      </ns0:Envelope>

    测试OK!!!

    --------------------------------------------------------

     

    2 修改message schema

    修改Schema1.xsd

     Envelope

         EnvelopeRoot

             a

             b

    重新编译部属

    并生成新的instance

    测试报错

    Reason: Cannot locate document specification because multiple schemas matched the message type

     

     

    我总不能手动为每一个消息都添加根Root吧???!!!

     

    2008年10月29日 6:48
  •  

    刚看到最新回复

    那比如file adapter

    该如何呢?

    2008年10月29日 6:50
  • 接收管道里要做的事拆分消息,就是说,从adapeter进来的消息就应该是符合信封的结构的消息,然后接收管道来拆信封。
    接收管道里要做的不是组成信封的消息。
    组成信封消息是发送者的工作,或者是adapeter的工作。
    2008年10月29日 6:53
  • file adapter的情况,那么在文件夹的文件内容就应该是:

    <ns0:Envelope xmlns:ns0="http://TestEnvelope.Envelope">
      <ns0:EnvelopeRoot>
        <ns0:c>1</ns0:c>
        <ns0:b>2</ns0:b>
      </ns0:EnvelopeRoot> 
      
      <ns0:EnvelopeRoot>
        <ns0:c>3</ns0:c>
        <ns0:b>4</ns0:b>
      </ns0:EnvelopeRoot>  

      <ns0:EnvelopeRoot>
        <ns0:c>5</ns0:c>
        <ns0:b>6</ns0:b>
      </ns0:EnvelopeRoot> 

     </ns0:Envelope>

     
    为什么应该是这样,是发送到这个文件到这个文件夹的发送者应该把文件组成这个样子。
    2008年10月29日 6:59
  •  Envelope.xsd

    Envelope

       <Any>

     

    /*[local-name()='Envelope' and namespace-uri()='http://TestEnvelope.Envelope']

     

    Schema1.xsd

    EnvelopeRoot

       a

        b
    ---------------------------------------

     sql adapter

    可以生成

    EnvelopeRoot

       a

        b

    这样的message schema

    拆分出

    <EnvelopeRoot>

     < / a

       < /b>

    </EnvelopeRoot>

    这样一条条记录

     

    而 file adapter

    手动制定这样的schema

    EnvelopeRoot

       a

        b

    通不过

    而必须添加根元素Envelope

     

    我最终的问题就是

    以上面例子

    使用file adapter 究竟该如何?

    2008年10月29日 7:05
  • 回帖里都说到了,仔细消化一下回帖的内容
    2008年10月29日 7:09
  •  

     

    也就是说

    测试该envelop 流程的 message instance

    不是该envelop 流程的schema生成的instance

    而是其他业务 流程 等 生成的

    进入envelop 流程的接收pipline时候

    已经预组装了Envelope 这个root

    只要拆分出来的一条条记录

      <ns0:EnvelopeRoot>
        <ns0:c>5</ns0:c>
        <ns0:b>6</ns0:b>
      </ns0:EnvelopeRoot> 

    符合

    envelop 流程的message schema

    即可

    是这个意思吧

     饶了好大个圈啊

    2008年10月29日 7:14
  • 正确。
     
    不过Envelope里封装的消息不一定都要同一个架构的,可以是不同架构的消息,只要是已经部署过的消息schema,接收管道就能认识这个消息。
    2008年10月29日 7:17