最近项目中遇到这样的需求,biztalk需要通过FTP adapter到合作伙伴的FTP服务器上取文件,并且在同一个FTP服务器上有多个路径取不同类型的数据,这样biztalk接收端就要建立多个receive location,每个location对应到一个FTP服务器上的一个路径。FTP服务器还有个限制,对同一个IP同时允许的连接数有限制为10个,而实际上biztalk需要对这个FTP建立的receive location有几十个,如果不加控制的话,很可能超过十个请求同时连接到FTP服务器,超过的连接将会收到超连接数的错误,导致接收失败。

这种情况就要控制到FTP服务器的连接请求在同一时间内限制在十个以内,如何做到这点?

在讨论这个问题前,先要介绍一下host和host instance。

在biztalk中,每个orchestration、receive location和send port都需要指定运行他们的Host,实际上对于receive location和send port是指定handler,而每个handler是跟Host一一对应的。

Host分两类,进程内和独立进程,如果是在biztalk进程内运行的Host叫进程内Host,大多数 biztalk服务都运行在进程内Host。在biztalk进程外进程运行的Host叫独立Host,基本上HTTP和SOAP这类需要外部IIS这类进程接收消息的Request-Response双向接收端口需要使用独立主机。这里只讨论进程内主机。

Biztalk Host是个逻辑上的概念,不能直接使用,与Host相对应的Host instance才是真正运行biztalk orchestration、receive location和send port的实际承载者(有点像类的概念,实例化为对象后才能使用)。在一个biztalk group中可以建立多个Host,在group里的每个biztalk server可以对group里的每个Host在本地建立一个instance,最多只能建一个,也可以不建。

在biztalk运行时,orchestration、receive location和send port都会由指定的Host相应的Host instance进程进行处理。实际上每个biztalk进程内主机就是一个BTSNTSvc.exe服务进程,安装biztalk后,默认有两个主机:进程内host是BizTalkServerApplication,独立主机是BizTalkServerIsolatedHost,在services中可以看到默认进程内主机实例的服务BTSSvc$BizTalkServerApplication,是一个BTSNTSvc.exe进程。如果在biztalk再建一个进程内host和相应的host instance,在services中就会多一个BTSNTSvc.exe服务进程与之相对应。

到此,介绍了host和host instance后,回过头来看一开始的需要控制到同一个FTP的连接数的需求。可以设想,能不能把连接到这个FTP的所有receive location都由同一个host instance服务进程处理,然后在这个服务进程内控制receive location并发数,如果能做到这点就能控制到FTP的同时连接数了。

十分幸运的是,biztalk的运行机制能帮我们实现这个设想。Biztalk 运行时,每个host instance就是一个进程,大家知道,每个进程都可以维护一个(也只有一个)进程池,biztalk就是使用这个进程池将orchestration、receive location或send por的实例作为一个线程放入进程池内运行。Dotnet 2.0的进程池默认最大工作线程数是25,也就是说默认状况下,一个host instance同时并发只能运行25个orchestration、receive location或send port的实例。

基于这个机制,应该可以在运行FTP receive location的那个host instance进程,修改它的最大工作线程为10个,这样,就能控制FTP receive location并发连接数在10个以内,多出来的并发连接请求在线程池外排队,等线程池内有空闲的线程继续运行。

下面是修改host instance的最大线程数的方法。

打开注册表,导航至[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTSSvc$hostinstancename],其中红色部分是要修改的主机实例名。在这个key下新建一个CLR Hosting 的key,然后在这个CLR Hosting key下,建一个MaxWorkerThreads的REG_DWORD的值,值的数据设置为10,这就设置了这个host instance的最大工作线程为10个。如下图:

最后,有一点需要注意:MaxWorkerThreads的值的最小值跟服务器的CPU核心数有关系,即这个值不能小于CPU的核心数,如果这个值小于CPU的核心数,这个host instance的服务进程在下次启动时将出错无法启动。在biztalk中表现为启动这个host instance提示:

在services中,启动相应的服务,提示:

Biztalk中Host Instance线程控制相关推荐

  1. C#中的多线程-线程同步基础 (控制线程数量)

    同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具: 简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程完成 锁系统 构成 目的 跨进程? 速度 loc ...

  2. Linux中的远程访问及控制

    文章目录 Linux中的远程访问及控制 SSH远程管理 OpenSSH服务器 ssh原理 公钥传输原理 ssh加密通讯原理 对称加密 非对称加密 配置OpenSSH服务端 登陆 服务端配置 ssh客户 ...

  3. BizTalk中的英文名词和中文释义

    最近研究BizTalk架构,并为书籍搜集整套详细资料,真是累死人了,相同类别的中文书籍10年前有过,此间,BizTalk更新升级无数次了,国内尚无一本相关开发类技术指导.虽说可能此框架不属于轻量级,不 ...

  4. 在C++程序中添加逻辑流程控制

    在C++ 程序中添加逻辑流程控制          问题的引出 在计算机程序中,除了常见的执行流程控制,还有逻辑流程控制:有时,执行流程即为逻辑流程,但在大多数情况下还是有所区别的,例如,假定有一个W ...

  5. c#中如何跨线程调用windows窗体控件?

    我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍. 首先来看传统方法: public partial ...

  6. RxJava使用(三)Scheduler 线程控制

    前言 在默认情况下,即在不指定线程的情况下,RxJava 遵循的是线程不变的原则,即:在哪个线程调用 subscribe(),就在哪个线程生产事件:在哪个线程生产事件,就在哪个线程消费事件. 如果需要 ...

  7. java中我爱你_Java线程学习(转)

    编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield(),join() 还有一个重要的关键字:s ...

  8. 孤荷凌寒自学python第三十八天初识python的线程控制

    孤荷凌寒自学python第三十八天初识python的线程控制 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.线程 在操作系统中存在着很多的可执行的应用程序,每个应用程序启动后,就可以看着 ...

  9. Java里的线程控制

    这篇文章接着上篇文章<<java 线程简介>> 写的. http://blog.csdn.net/nvd11/article/details/19118683 上一篇文章提到, ...

  10. 关于操作系统中进程、线程、死锁、同步、进程间通信(IPC)的超详细详解整理

    ​​​​​​​作者主页:https://www.zhihu.com/people/san-hao-bai-du-ren-79 一.什么是进程?什么是线程? 1.1 进程定义 1.2 线程定义 1.3 ...

最新文章

  1. php百度地图添加标记,JavaScript API - 自定义标注 | 百度地图API SDK
  2. 四十六、获得SD卡的大小以及内部的文件信息
  3. HttpClient 设置不当引发的一次雪崩!
  4. Spring Cloud 应用在 Kubernetes 上的最佳实践 — 高可用(混沌工程)
  5. JVM性能调优实践:G1 垃圾收集器介绍篇
  6. template标签_Django实战: 利用自定义模板标签实现仿CSDN博客月度归档
  7. c语言函数大全doc,c语言函数大全.doc
  8. mysql 并发 加锁_MySQL的并发控制与加锁分析
  9. Android 推荐一个Android系统全系列源码在线阅读网站,Android学习资料,Android各个API使用的网站
  10. 指针进阶:函数指针的应用场景
  11. matlab中三维数组,维数转换
  12. mysql逗号后update_隔mysql逗号
  13. 2020-10-19 Nvidia与vGPU
  14. 170929 逆向-Reversing.kr(Ransomware)
  15. 微信小程序weui的使用
  16. 苹果设备上的无损音乐alac
  17. 用计算机投屏图片,手机投屏Windows7电脑图文教程
  18. banner中居中的page显示完全,其余显示百分之20--仿网易云首页轮播图
  19. oracle 8i 启动,如何快速启动oracle 8i SQL-Plus?
  20. 布袋除尘器有关matlab编程,布袋除尘器工作原理结构图及使用注意事项

热门文章

  1. pyton-虚拟环境以及django的初步使用记录信息
  2. python-gui-pyqt5的使用方法-2
  3. 零基础入门cv - 街景字符编码识别_零基础入门CV赛事- 街景字符编码识别-03
  4. RSA、DSA算法原理与举例
  5. srs2.0安装问题
  6. 正则表达式校验特殊格式
  7. javascript内置属性
  8. training test validation 各有其用,实践中有了体会
  9. AC自动机-算法详解
  10. myisam 与 innodb的区别,在什么情况下用什么ENGINE