1、RNIFReceive.aspx 页接收来自发起方的传入消息。

(如果发起方是BizTalk则类似于:http://localhost/BTARNApp/RNIFSend.aspx?TPUrl=https://&xRNVersion=RosettaNet%%2fV02.00&xRNResponseType=async 的形式进行调用),如果使用HTTPS会话的话发起方会用自己的私钥和对方的公钥加密数据,所以中间不能有代理服务器的证书否则会失败。

2、RNIFReceive.aspx会调用BTARN的SDK将消息提交给HTTP适配器,HTTP 适配器再将其提交给接收管道。

3、接收管道将接收到的消息存储在MessageStorageIn表中,并对消息进行解码、拆装并解析参与方,然后将消息转换成后端业务线应用程序的专用格式。其中组件和阶段如下:

  1. RNMiMeDecoder( MIME 预处理器/解码器): 对RNIF2.0e服务内容及附件(如有)进行解密。对于RNIF1.1,对负载末尾的八字节和分离的签名头进行处理。
  2. RNDASM(拆装器,基于XMLdesimber): (1)如果某个传入文档含有 DOCTYPE 头,则本组件根据该头生成一个命名空间,然后将该传入文档中的所有节点移入该命名空间。(2)执行消息相关以确定传入消息是否重复;(3)如果消息重复,则生成错误消息。将附件作为消息的附加部分进行存储。(4)升级消息属性。
  3. RNPartyRes(参与方解析): (1)如果某个 BizTalk 参与方签署了传入消息,则映射发件人证书;如果传入消息未签名,并且该消息是贸易合作伙伴协议允许的,则本组件在 RNIF 2.01 的传递头或 RNIF 1.1 的服务头中检索发件方。(2)请确认发件人存在,并且发件人与本组织有贸易合作伙伴协议。
  4. MessageUpdater:(1)使用以下各项的详细信息更新 MessageStorageIn 表:PIP 代码、PIP 版本、源参与方、目标参与方和线路消息(由 ReceiveMessageNonRepudiate 组件存储)的消息跟踪 ID。 (2)如果 PIP 不要求不可否认性,则将相应记录标记为删除,设置 ToBePurged = True。

4、BTARN 将消息路由至 MessageBox 数据库。

5、公用流程处理消息的 RNIF 头。

  1. 响应方公用流程从响应方 MessageBox 数据库接收 RNIF 消息。
  2. 公用流程从操作消息中提取服务内容和头,并将它们发送到专用流程。 注:响应方公用流程对传入消息执行标准验证(以及验证适配器中包含的其他所有可用验证)。如果验证成功,公用流程将启动应用程序适配器,以便执行与特定的实现相对应的通知。响应方公用流程将在 MessageBox 数据库中保存消息,并通知响应方专用流程它已将消息保存在 MessageBox 数据库中(使用 ApplicationAdapter 类中的 BeginNotify 方法)
  3. 如果活动为异步单操作,则公用流程通过将服务内容消息部分与前导头、服务头和传递头(仅限于 RNIF 2.01)进行包装来构造 RNIF 信号消息(确认接受)。该公用流程使用参与方之间的贸易合作伙伴协议中存储的信息来构造前导头、服务头和传递头,这些信息包括:流程配置设置、源参与方和目标参与方的配置信息以及合作伙伴接口流程 (PIP) 变量。然后流程将信号消息发送到发起方。如果消息为单操作消息,则消息流完成。
  4. 如果是双向流程,公用流程进入等待状态(等待响应方专用流程的操作)。
  5. 以下操作可结束此等待状态:(1)响应方专用流程返回响应服务内容消息和头,以响应原始操作消息(它是双操作消息)。(2)公用流程从发起方接收失败通知 (NoF) 消息。
  6. 响应方公用流程进入等待状态(等待接收来自发起方的信号,以对响应方公用流程发出的响应消息做出响应)

6、专用流程处理消息的服务内容。它将生成一个确认,该确认将依次返回至公用流程、MessageBox 数据库、发送管道和 HTTP 适配器,以便最终通过 Internet 返回至发起方。

  1. 响应方专用流程从响应方公用流程接收路由自发起方计算机的原始传入消息。
  2. 专用流程构造 LOB 应用程序消息。这涉及到获得 LOB 消息模板、序列化 XML 服务内容以及将 XML 消息部分加载到 LOB 消息。
  3. 专用流程将消息路由到 BTARNDATA SQL Server 数据库的 MessagesToLOB 表中,再路由到后端 LOB 应用程序。
  4. 如果原始消息带有附件,则专用流程调用 AttachmentHelper 组件来处理附件。
  5. 专用流程向 LOB 应用程序发送通知,通知此应用程序它将响应消息保存到了 MessagesToLOB 表中。
  6. 如果消息为单操作消息,则专用流程完成。
  7. 如果消息为双操作流程,则专用流程会侦听来自 LOB 应用程序的响应。
  8. 当专用流程接收到来自 LOB 应用程序的响应时,它会构造响应消息,并将此消息发送到公用流程。
  9. 专用流程等待来自公用流程的信号。如果接收到信号,它会构造 LOB 信号消息并将其发送到 LOB 应用程序。如果 RNIF 版本为 1.1,专用流程将侦听第二个确认信号,一旦接收到此确认信号,专用流程将构造 LOB 信号消息并将其发送到 LOB 应用程序。在发送每个信号消息之后,专用流程会通知 LOB 应用程序。
  10. 如果专用流程从公用流程接收到路由自发起方的“失败通知”(NoF) 消息,则专用流程会构造“BTARNException”消息并将其发送到 LOB 应用程序。 ## 7、BTARN 将消息路由至 MessageBox 数据库。 ## 8、发送管道对消息进行组装,然后签名/加密/编码,发送管道将发送的消息存储在MessageStorageOut表中。
  11. 如果贸易合作伙伴协议中的“将所有部分编码”设置为 True,则 MIME/SMIME 编码器将对所有消息部分进行编码。所用的编码方法是在该协议的 Encoding 属性中设置的。
  12. 对于 RNIF 2.01,如果消息是操作消息并带有附件,则编码器将对每个附件执行以下操作:(1)如果附件是二进制的,则编码器将对其进行编码。(2)编码器将生成该附件的内容 ID。(3)编码器将创建该附件的 MIME 部分。
  13. 对于 RNIF 2.01,该管道将根据“是否要求永久保密”设置(按照流程配置设置中的设置)对消息部分进行加密并生成 RNIF 消息:(1)如果将“是否要求永久保密”设置为“负载”,则编码器将对服务内容和附件进行加密。然后,组装器添加服务头、传递头和前导头以构造最终的 RNIF 消息。(2)如果将“是否要求永久保密”设置为“负载容器”,则编码器将对服务头、服务内容和附件进行加密。然后,组装器添加传递头和前导头以构造最终的 RNIF 消息。(3)如果将“是否要求永久保密”设置为“无”,则组装器将服务头、传递头和前导头添加到服务内容和附件中(不加密),以构造最终的 RNIF 消息。
  14. 对于 RNIF 1.1,组装器将构造不加密的最终 RNIF 消息。
  15. 编码器在以下情况对消息进行签名(如有) ## 9、通过发送ASPX页发送消息出去
  16. 发送页对消息进行验证。
  17. 发送页根据消息的内容类型、长度、ID 和多用途 Internet 邮件扩展 (MIME) 版本创建 MIME 头。该页将 MIME 头和 MIME 上下边界添加到消息中。
  18. 发送页使用 HTTP Post 按照贸易合作伙伴协议中操作 URL 或信号 URL 设置设定的位置将消息发送到合作伙伴的目标 URL。
  19. 然后发送页等待 HTTP 响应。接收到响应后,它将该响应路由到 HTTP 适配器。
  20. 如果连接是异步的,发送页将关闭连接,处理过程完成。
  21. 如果连接是同步的,发送页将保持连接的开通以接收返回的消息。发送页在收到消息以后执行的处理与 RNIFReceive.aspx 对所收到消息的处理相同,然后,发送页将收到的消息发送到 HTTP 适配器,最后关闭连接。

参考文档

BizTalk Accelerator for RosettaNet 如何工作

BTARN 接收消息流以3A7为例的更多相关文章

  1. RabbitMQ 入门系列:3、基础编码:官方SDK的引用、链接创建、单例改造、发送消息、接收消息。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  2. MQTT协议笔记之消息流

    前言 前面的笔记已把所有消息类型都过了一遍,这里从消息流的角度尝试解读一下. 网络故障 在任何网络环境下,都会出现一方连接失败,比如离开公司大门那一刻没有了WIFI信号.但持续连接的另一端-服务器可能 ...

  3. Android中ListView嵌套GridView的简单消息流UI(解决宽高问题)

    最近搞一个项目,需要用到类似于新浪微博的消息流,即每一项有文字.有九宫格图片,因此这就涉及到ListView或者ScrollView嵌套GridView的问题.其中GridView的高度问题在网上都很 ...

  4. 【Spring】使用Spring和AMQP发送接收消息(中)

    上篇讲了RabbitMQ连接工厂的作用是用来创建RabbitMQ的连接,本篇就来讲讲RabbitMQ的发送消息.通过RabbitMQ发送消息最简单的方式就是将connectionFactory Bea ...

  5. RTMPdump(libRTMP) 源代码分析 9: 接收消息(Message)(接收视音频数据)

    ===================================================== RTMPdump(libRTMP) 源代码分析系列文章: RTMPdump 源代码分析 1: ...

  6. SNF开发平台WinForm-审核流使用方法样例

    一.效果如下: 二.如何实现 1.程序的数据表设计规范,参考<09.SNF-C#编程规范V1.5.docx>文件. 2.程序操作程序 2.1.在程序页面拖拽控件 2.2.程序的Load事件 ...

  7. Storm概念学习系列之Stream消息流 和 Stream Grouping 消息流组

    不多说,直接上干货! Stream消息流是Storm中最关键的抽象,是一个没有边界的Tuple序列. Stream Grouping 消息流组是用来定义一个流如何分配到Tuple到Bolt. Stre ...

  8. .net core 消息流处理流程

    前言 2020年即将进入尾声,分享一下在现公司业务处理流程,一起讨论在分布式场景下,如何通过消息流的方式处理各种复杂的业务场景,这里涉及到一些常用组件,后面结合场景与代码来具体说明 场景说明 这里就拿 ...

  9. RabbitMQ 入门 (Go) - 2. 发布和接收消息

    本文我将使用 Go 语言在 RabbitMQ 上发布和接收消息. Go 的标准库本身并没有 RabbitMQ 的原生绑定,但是有一个第三方库确能够支持 RabbitMQ,它的源码在 https://g ...

随机推荐

  1. BZOJ.3784.树上的路径(点分治 贪心 堆)

    BZOJ \(Description\) 给定一棵\(n\)个点的带权树,求树上\(\frac{n\times(n-1)}{2}\)条路径中,长度最大的\(m\)条路径的长度. \(n\leq5000 ...

  2. 连接到docker 指定的一个容器中

    1.docker run -itd ubuntu 2.sudo docker ps 3.PID=$(docker-pid containerID)  返回一个p_id 4.nsenter --targ ...

  3. ESlint开发环境配置

    ESLint 是在 ECMAScript/JavaScript 代码中识别和报告模式匹配的工具,它的目标是保证代码的一致性和避免错误,是JS开发过程中极佳工具,这篇文章将以WebStorm为例告诉你如 ...

  4. 全局解释器锁 GIL

    1.什么是GIL? GIL本质上是互斥锁,可以将并发运行变为串行,以此来控制同一时间内共享数据只能被一个任务修改,保证时间安全 2.GIL应用场景 使用原因:Cpython解释器自带垃圾回收机制不是线 ...

  5. C++学习笔记50:队列类模板

    队列是只能向一端添加元素,从另一端删除元素的线性群体 循环队列 在想象中将数组弯曲成环形,元素出队时,后继元素不移动,每当队尾达到数组最后一个元素时,便再回到数组开头. 队列类模板 //Queue.h ...

  6. 2017.07.10【NOIP提高组】模拟赛B组

    Summary 今天题目总体不是难,但是分数很低,只有100+10+30,其中第二题还是以前做过的,第一题设计数论,而且以前做过同一个类型的题目,比赛推了很长时间.第三题时以前做过的原题,是贪心没学好 ...

  7. .net 4.0 中的特性总结(四):Tuple类型

    Tuple是具有指定数量和顺序的值的一种数据结构.针对这种数据结构,.Net4.0中提供了一组Tuple类型,具体如下: Tuple   Tuple<T>   Tuple<T1, T ...

  8. Yii2 DetailView小部件

    DetailView小部件 Yii 提供了一套数据库小部件 widgets,这些小部件可以用于显示数据 DetailView 小部件用于显示一条记录数据 ListView 和 GridView 可以用 ...

  9. vue中引用vux

    官网看不懂,网上搜了下,以备不时之需 这是官网说明文档,看不懂的啊. Vux使用教程: 1,在项目里安装vux cnpm install vux --save 2,在项目里安装vux-loader(这 ...

  10. Java 读取 txt 文件内容到容器 List

    方法一: 一.桌面上准备 DataObject.txt 文件,内容为: 二.打开 Eclipse,编写代码如下: import java.io.BufferedReader; import java. ...