biztalk中的发送端口产生异常及处理(下)
一、 发送端口返回NACK后的处理方法<?xml:namespace prefix = o />
1、 挂起的Orchestration是否可恢复?
不管是一般发送端口或是web类型的发送端口,一旦接收到NACK消息,Orchestration抛出异常后,如果没有设置scope捕获异常并处理,将导致Orchestration服务实例被挂起。
这样挂起的Orchestration服务实例是否可恢复呢?
如果Orchestration没有设置Exception Handler,发送端口的失败会导致两个挂起的服务实例:一个是发送端口的服务实例,一个是Orchestration的服务实例。
下面分别测试一下两种发送端口在未设置scope挂起后是否能被恢复。
1.1. 一般发送端口错误导致挂起的Orchestration
一般的发送端口,发送一条数据插入到sql server,如果是因为插入了重复键导致了发送消息失败,将产生两个挂起的服务实例。
Figure 3. 物理发送端口出错后产生的两个挂起的服务实例
图中上面一个Messaging类型的服务就是sql的发送端口服务实例。
下面那个是Orchestration服务实例。
在sql server把重复键的那条记录删除后,测试是否可以恢复这两个服务实例。分别在两个服务实例上点击右键,选“Resume Instance”。
测试发现:
sql的发送端口服务实例可以被恢复,恢复后数据被写入数据库,挂起的sql的发送端口服务实例完成,不再挂起。
Orchestration服务实例进行恢复后,依然抛出同样的错误,服务实例再次被挂起。不管恢复多少次Orchestration,总是会抛出同样的异常。
1.2. Web类型发送端口错误导致的Orchestration
经过测试,web类型的发送端口错误导致刮起的Orchestration,跟一般端口错误导致挂起的Orchestration一样,也是发送端口在外部条件恢复后可以resume,Orchestration却不再能resume。
测试结果:
似乎有这样的规律,orchestration收到了NACK的消息导致挂起,这样挂起的orchestration都不能恢复。
分析原因可能是因为第一个NACK消息已经被Orchestration接收,再次resume运行Orchestration,这个NACK消息再次导致Orchestration抛出异常,所以,不管恢复多少次Orchestration,总是会抛出同样的异常。
不知道是否有什么方法能把这个NACK消息从挂起的Orchestration实例中去掉?
2、 如何处理发送端口出错的情况
从上面的测试可以看到,一旦发送端口返回了NACK后,即使导致发送端口出错的外部条件恢复后,发送端口可以resume,但是挂起的Orchestration再也不能恢复了。
下面设计一个处理这种情况的方法。
设计一个简单场景,Orchestration从A系统接收消息,做必要的转换后,把消息通过Port_ConsumeWS web端口发送到Web services,Orchestration接收到WS返回的消息,把返回消息通过Port_2端口发送到B系统。
Figure 4. 发送端口出错后Orchestration异常处理
2.1. 异常处理并告知源系统出错
发送形状设置scope用以捕获发送端口返回的异常。
Exception Handler的Exception Object Type 设置为System.Web.Services.Protocols.SoapException(可能需要引用System.Web.Services.dll程序集)。
Exception Handler的Exception Object Name设置为e,表示捕获到的一场对象。
在ConstructMessage_2消息构造形状中构造一个反映SoapException异常的消息Message_Fault(XmlDocument类型的消息)。
Message_Fault = new System.Xml.XmlDocument();
Message_Fault.LoadXml(e.Detail.InnerXml);
e.Detail.InnerXml 就是NACK的消息实际内容。
最后把这个NACK消息返回给A系统,告诉A系统发送消息失败。这个Orchestration然后正常结束。
A系统接到失败消息后,可以在系统内部设计一个机制,比如间隔一定时间后,再次发送同样的消息。
2.2. 路由失败消息
前面Orchestration异常处理后,Orchestration把失败消息发送到A系统,之后Orchestration正常结束了。但是发送端口返回NACK后,物理发送端口本身也被挂起,如果不加处理,挂起的发送端口服务实例一直会被挂着,可以通过路由失败消息的机制把发送端口失败的消息路由到某一个文件夹,作为垃圾收集站,同时消除里挂起的发送端口实例。
2.2.1. 设置允许路由失败的消息
需要允许发送到web services的SOAP发送端口导致的失败消息可以路由。
在biztalk administrator中查看这个物理端口的属性,然后在Transport Advanced Options 中设置“Enable routing for failed messages”。
Figure 5. 发送端口设置为允许路由失败的消息
2.2.2. 新建收集失败消息的发送端口
在biztalk administrator中新建一个File的发送端口,用来订阅失败的消息,都发送到一个文件夹。
设置发送端口的属性。
设为File类型的发送端口,路径指向设置好的文件夹。
端口的Filters设置如下:
Figure 6. 收集失败消息发送端口的订阅设置
Filter属性用来定义发送端口订阅消息的条件。
ErrorReport.ErrorType == FailedMessage And
ErrorReport.OutboundTransportLocation == http://biztalkr2:81/WSTest/Service1.asmx
这样的条件表示发送端口订阅失败的消息,并且是发往“http://biztalkr2:81/WSTest/Service1.asmx”的失败消息。
3、 总结
通过异常处理和路由失败消息,可以把发送端口产生异常导致的服务实例的挂起进行处理,结果是源系统可以获得消息未被成功发送的通知,从而可以采取相应的处理办法,或者定时重发,或者通过别的渠道处理消息等等。biztalk这边异常被处理,挂起的服务也都得到处理。
如果在发送形状前面还有业务流程并产生了作用,捕获异常后可能还需要做相应的补偿,这里没有讨论补偿的问题。
另外,这个方案应该不是最佳方案,因为A系统已经把消息发送到biztalk系统,如果在导致异常的外部条件已经恢复后,能够在biztalk这个部分就能实现resume那是最理想的。
转载于:https://www.cnblogs.com/chnking/archive/2007/12/13/993702.html
biztalk中的发送端口产生异常及处理(下)相关推荐
- linux snmp更改端口号,如何更改linux中的net-snmp陷阱发送端口?
我正在使用net-snmp在Linux中收集系统信息. 但我发现有问题.如何更改linux中的net-snmp陷阱发送端口? 当我通过netstat检查Net-SNMP的端口使用情况时,发现使用3个U ...
- BizTalk中的英文名词和中文释义
最近研究BizTalk架构,并为书籍搜集整套详细资料,真是累死人了,相同类别的中文书籍10年前有过,此间,BizTalk更新升级无数次了,国内尚无一本相关开发类技术指导.虽说可能此框架不属于轻量级,不 ...
- 使用comm在java程序中管理本地端口[回钦波:高级软件工程师]
使用comm在java程序中管理本地端口 最近在做电信项目,遇到一些专业性的问题,在这里和大家一起分享下comm包下的类及如何使用等问题: 在java程序中,为了实现同本地系统的硬件端口(RS-232 ...
- linux如何关闭udp端口,如何阻止linux RHEL7中的udp端口范围(How to block udp ports range in linux RHEL7)...
如何阻止linux RHEL7中的udp端口范围(How to block udp ports range in linux RHEL7) 需要测试使用UDP端口范围从5000到60,000英寸的应用 ...
- linux中如何查询端口被占用的情况
今日要运用python写一个端口勘探的小程序,以检测一些特定的效劳端口有没有被占用,突然发现自个竟然不知道在linux中怎么查询端口被占用的情况,天呐,从速学习一下. Linux如何查看端口 1.ls ...
- 如何发现 Kubernetes 中服务和工作负载的异常
大家好,我是来自阿里云的李煌东,今天由我为大家分享 Kubernetes 监控公开课的第二节内容:如何发现 Kubernetes 中服务和工作负载的异常. 本次分享由三个部分组成: 一.Kuberne ...
- python测试udp端口_Linux系统的ECS实例中TCP/UDP端口测试及验证方法说明
免责声明:本文档可能包含第三方产品信息,该信息仅供参考.阿里云对第三方产品的性能.可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺. 概述 本文主要介绍在Linux系统的ECS实例中,如 ...
- selenium自动化测试_49自动化测试中最常见的Selenium异常
selenium自动化测试 开发人员将始终在编写代码时牢记不同的场景,但是在某些情况下,实现可能无法按预期工作. 相同的原则也适用于测试代码,该代码主要用于测试现有产品的功能,发现bug并确保产品10 ...
- 49自动化测试中最常见的硒异常
开发人员将始终在编写代码时牢记不同的场景,但是在某些情况下,实现可能无法按预期工作. 相同的原则也适用于测试代码,该代码主要用于测试现有产品的功能,发现错误以及使产品100%不受错误影响. 正确地说, ...
最新文章
- QIIME 2教程. 26为QIIME 2开发新插件DevelopingPlugin(2021.2)
- 智能车竞赛技术报告 | 专科基础组 - 哈尔滨铁道职业技术学院 - 智能车勇创协会
- 使用FIO对SATA、SSD和PCIe Flash进行测试
- python3菜鸟-菜鸟笔记Python3——数据可视化(一)
- JC法在matlab,自贡自流井启闭机--四川闸门厂家产品中心
- 【数据结构与算法】常用算法
- NLTK使用英文词性还原
- idea 添加注释模版
- 5年了...Capstone 终于升级到4.0!
- spark学习——(二)spark基础环境配置-linux(1)
- 【基于熵权-模糊综合评价法】《基于熵权-模糊综合评价法的施工项目风险评价研究》论文笔记(内附MATLAB代码)
- 定时清理elasticsearch索引和数据
- 微信公众号模板消息的申请
- 期货开户公司想恶意滑点是做不到的
- mysqly优化 入门 第一篇
- Rust权威指南 读书笔记
- php捉迷藏,查看“蘑菇捉迷藏!”的源代码
- html立体图表样式,项目进度可视化图表
- MATLAB函数大全 .
- 计算机开根号原理,根号的原理_怎么开的根号,有原理吗
热门文章
- stm32如何执行软复位_常见的单片机复位方式及其原理分析
- c语言给定变量a的初始值,2018年9月计算机二级C语言考试冲刺提分试题(一)
- 英特尔nuc能代替主机吗_制砂机生产的沙子可靠吗?能代替天然沙子吗?
- Java多线程闲聊(一):概论
- base64 长度补全
- Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析
- VMware安装CentOS6
- [Linux]学习笔记(4)-su及passwd的用法介绍
- iOS开发的库的列表,不完全是开源库
- C/C++中各种类型int、long、double、char表示范围(最大最小值)