创建基于MSMQ的Responsive Service

合集下载

uos系统PXE搭建原理和过程

uos系统PXE搭建原理和过程

uos系统PXE搭建原理和过程1.1.1 dnsmasq 方式1.1.1.1 安装dnsmasq/# sudo apt-get install dnsmasq1.1.1.2 修改配置文件/# sudo vim /etc/dnsmasq.confListen-address=192.168.1.1interface=enp5s0 // 要使用的网卡节点bind-interfacesdhcp-range=192.168.1.10,192.168.1.100,255.255.255.0,8h dhcp-option=3,192.168.1.1dhcp-option=6,192.168.1.1dhcp-option=28,192.168.1.255dhcp-option=42,0.0.0.0enable-tftpdhcp-match=set:Intel_x86PC,option:client-arch,0dhcp-boot=tag:Intel_x86PC,x86_64-legacy/pxelinux.0 dhcp-match=set:EFI_BC,option:client-arch,7dhcp-boot=tag:EFI_BC,x86_64-efi/netbootx64.efidhcp-match=set:EFI_x86_64,option:client-arch,9dhcp-boot=tag:EFI_x86_64,x86_64-efi/netbootx64.efi dhcp-match=set:EFI_Arm64,option:client-arch,11dhcp-boot=tag:EFI_Arm64,arm64-efi/netbootaa64.efi dhcp-match=set:Mips,option:client-arch,12tftp-root=/var/lib/tftpboot // -----提前建好目录1.1.1.3 tftpd 中的文件放置创建tftp 根目录/# mkdir /var/lib/tftpbootarm64.tar.gz //---- 已经获得如果目标安装机器为新四核或者鲲鹏,则将arm64.tar.gz 解压出来的arm64-efi 目录拷贝至tftp 根目录下;并将系统iso 中casper/下的initrd.img 和Image放到arm64-efi/casper 下。

使用MSMQ实现SQL SERVER的推送服务

使用MSMQ实现SQL SERVER的推送服务

s ei ue.U igdtbs r gr,C R s rdpoeue o x ne trd poeue i h S esg g i s sd s a aetge d n a i s L t e rcd r ret dd s e rcd r,wt te M MQ m sai o e o h n
致该表上触发器被触发 。 4 )存 储 过 程 的 调 用 (trdp cd r vct n 。 Soe r euei oao ) o n i 为 了 响应 数 据 库 更 新 ,触 发 器 可 以 调用 一个 或 多个 存 储
况, 提出 了一种使用 MS MQ和触发器机制实 现的数 据库的推
c p bl is ad tb s u hd t e iei lme td a a i t , aa a ep s aa s r c i e n e . ie v s mp Ke r s d tb s ;p s e v c y wo d : aa a e u h s r ie;soe r c d r ;me s g u u trdpo e ue sa e q e e;t g e r gr i
式, 消息 的安全性 、 事务性等要求 , 考虑使用 MS MQ作为 消息
的 中转 方 式 。
变 化 情 况 。对 于 多个 应 用 程 序 关 注相 同 事 件 的 情 形 下 . 需 只
要建立一个触发 器。
3 MS MQ
MS ( coot saeQ e igSre, MQ Mi sfMesg uun evr消息 队列 ) r 是一
数 据 库 在 现 代 信 息 技 术 里 面 具 有 重 要 的 地 位 , 数 的 的 多 应 用 系 统 都 是 以 数 据 库 为 中 心 进行 开 发 的 。 数 据 库 的相 关 在

NET中MSMQ完整教程

NET中MSMQ完整教程

中进行消息处理(MSMQ) 一MSMQ是微软消息队列的英文缩写。

那么什么是消息队列?这些介绍网上一大片这里就不多说了。

本文对于大虾级的人物来说这只是小玩意而已,对于初学者来说这文章还是有一定的帮助,希望路过的大虾们别笑话我班门弄斧。

一、MSMQ介绍和安装消息队列关于MSMQ详细的介绍请大家向/或/等专家咨询。

使用消息队列的优点:稳定、消息优先级、脱机能力以及安全性。

消息队列分为用户创建的队列(专用队列)和系统队列,用户队列分为,。

我是Windows XP,看下图所示(myQueue为自己创建的消息队列,msmqtriggersnotifiations为通用队列):对消息队列有了简单的了解后,使用MSMQ进行软件开发需要安装MSMQ,安装完后就该进入实际的开发阶段。

具体的安装过程就是在控制面板里“添加/删除程序”下“添加/删除Windows组件”,完成添加就OK。

安装完成后就可以通过交互界添加新的消息队列,详细如下图:出了上面这种交互界面来创建MSMQ外,也可以通过编程来完成,.NET框架里的MessageQueue类下有一静态方法Create,用来完成消息队列的创建,其定义如下: 1//2// 摘要:3// 在指定的路径中创建非事务性“消息队列”队列。

4//5// 参数:6// path:7// 要创建的队列的路径。

8//9// 返回结果:10// 表示新队列的 System.Messaging.MessageQueue。

11public static MessageQueue Create(string path);12//13// 摘要:14// 在指定的路径中创建事务性或非事务性“消息队列”队列。

15//16// 参数:17// transactional:18// 如果创建事务性队列,为 true;如果创建非事务性队列,则为 false。

19//20// path:21// 要创建的队列的路径。

MSMQ消息的应用(实例和代码)

MSMQ消息的应用(实例和代码)

本文介绍以下内容:∙如何创建一条消息,并将其发送给Microsoft 消息队列,而在Windows 应用程序中。

∙如何从专用队列中读取和反序列化消息内容进行显示。

写入并从Microsoft 消息队列中读取在 框架中,该System.Messaging命名空间具有读取和写入Microsoft 消息队列所需的类。

若要进行一个小的Windows 应用程序模拟一个联机的物料的付款系统,请按照下列步骤操作:1.打开Microsoft Visual 或Microsoft Visual Studio 2005。

2.创建一个新的Windows 应用程序在Visual C#,然后MSMQ命名它。

3.如果没有出现,请显示解决方案资源管理器,请按CTRL + ALT + L。

在解决方案资源管理器中,右击引用,然后单击添加引用。

4.在.net选项卡上,选择System.Messaging.dll文件中的.dll 文件的列表。

单击选择,然后单击确定。

(注意在Visual Studio 2005 单击System.Messaging.dll的dll,列表中的文件,然后单击确定.)5.Form1.cs 是在设计视图中打开。

6.从工具箱拖动到Form1的中间位置的下面:o 4 行中的每个标签,并且(位置右侧的每个标签)的文本框。

o在标签和文本框下两个按钮控件拖到Form1。

7.用鼠标右键单击控件,单击属性,然后再将标签的Text属性设置为下列(按顺序):o付薪到:o您的姓名:o金额:o截止日期:8.在属性对话框button1文本属性设置为发送支付,和button2的Text属性设置为处理付款。

9.您必须首先在计算机管理控制台中创建的专用队列使用时,此应用程序工作正常。

若要这样做,请按照下列步骤操作:a.在桌面上右键单击我的电脑,然后单击管理。

b.展开服务和应用程序节点以找到消息队列。

注意如果找不到消息队列,则说明未安装该程序。

如何安装消息队列(MSMQ)

如何安装消息队列(MSMQ)

如何安装消息队列(MSMQ)2011-08-25 10:26 1365人阅读评论(1) 收藏举报windowsmicrosoftserver服务器xp1.在Windows Server 2008 or Windows Server 2008 R2 上安装消息队列4.0在服务器管理器中,单击“功能”。

在“功能摘要”下的右窗格中,单击“添加功能”。

在生成的窗口中,展开“消息队列”。

展开“消息队列服务”。

单击“目录服务集成”(用于加入域的计算机),然后单击“HTTP 支持”。

单击“下一步”,然后单击“安装”。

2.在Windows 7 或Windows Vista 上安装消息队列4.0打开“控制面板”。

单击“程序”,然后在“程序和功能”下单击“打开或关闭Windows 功能”。

展开“Microsoft Message Queue (MSMQ) 服务器”,展开“Microsoft Message Queue (MSMQ) 服务器核心”,然后选中对应于以下要安装的“消息队列”功能的复选框:o MSMQ Active Directory 域服务集成(用于加入域的计算机)。

o MSMQ HTTP 支持。

单击“确定”。

如果提示您重新启动计算机,请单击“确定”完成安装。

3.在Windows XP 和Windows Server 2003 上安装消息队列3.0打开“控制面板”。

单击“添加/删除程序”,然后单击“添加/删除Windows 组件”。

选择“消息队列”并单击“详细信息”。

注意:如果运行的是Windows Server 2003,请选择“应用程序服务器”来访问消息队列。

确保在详细信息页上已选中“MSMQ HTTP 支持”选项。

单击“确定”退出详细信息页,然后单击“下一步”。

完成安装。

如果提示您重新启动计算机,请单击“确定”完成安装。

MSMQ菜鸟教程

MSMQ菜鸟教程

MSMQ菜鸟教程⼀、MSMQ概述MSMQ全称MicroSoft Message Queue,微软消息队列,是在多个不同的应⽤之间实现相互通信的⼀种异步传输模式,相互通信的应⽤可以分布于同⼀台机器上,也可以分布于相连的⽹络空间中的任⼀位置。

它的实现原理是:消息的发送者把⾃⼰想要发送的信息放⼊⼀个容器中(我们称之为Message),然后把它保存⾄⼀个系统公⽤空间的消息队列(Message Queue)中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进⾏处理。

消息Message是由通信的双⽅所需要传递的信息。

队列的类型主要包括⼀下⼏种:“公共队列”在整个“消息队列”⽹络中复制,并且有可能由⽹络连接的所有站点访问。

“专⽤队列”不在整个⽹络中发布。

相反,它们仅在所驻留的本地计算机上可⽤。

专⽤队列只能由知道队列的完整路径名或标签的应⽤程序访问。

“管理队列”包含确认在给定“消息队列”⽹络中发送的消息回执的消息。

指定希望 MessageQueue 组件使⽤的管理队列(如果有的话)。

“响应队列”包含⽬标应⽤程序接收到消息时返回给发送应⽤程序的响应消息。

指定希望 MessageQueue 组件使⽤的响应队列(如果有的话)。

优点:稳定、消息优先级、脱机能⼒以及安全性,有保障的消息传递和执⾏许多业务处理的可靠的防故障机制。

缺点:MSMQ不适合于Client需要Server端实时交互情况.⼤量请求时候,响应延迟.⼆、安装启⽤服务1. 控制⾯板 >> 程序 >> 打开或关闭Windows功能 >> Microsoft Message Queue(MSMQ)服务器,勾选消息队列服务所有选项2. 我的电脑 >> 管理 >> 服务和应⽤程序 >> 消息队列。

出现消息队列则说明安装成功三、MSMQ编码应⽤举例以下是⼏个常⽤查询代码请先添加using System.Messaging;命名空间1. 查询队列是否存在,值得注意的是,当访问远端消息时MSMQ不⽀持MessageQueue.Exists(string )等⽅法,所以建议直接使⽤new MessageQueue(QueuePath)查询///<summary>///查询队列是否存在///</summary>///<returns></returns>public bool QueueExist(){bool queueExist = false;try{queueExist = MessageQueue.Exists(QueuePath);}catch//远端访问不⽀持exist,所有直接查询{queueExist = true;}return queueExist;}2. 创建队列,传⼊存储对象和注解标签///<summary>///创建队列///</summary>///<param name="queueObj">发送到队列的对象</param>///<param name="queueLable">该发送队列对象的标签</param>public void CreateQueue(object queueObj, string queueLable = ""){try{using (MessageQueue queue = QueueExist() ? new MessageQueue(QueuePath) : MessageQueue.Create(QueuePath)) {bel = queueLable;if (queue.CanWrite){queue.Send(queueObj);}}}catch (Exception ex){throw new Exception("Error to Create Queue!", ex);}}3. 获取队列第⼀条数据,并删除数据///<summary>///获取队列第⼀条数据,并删除数据///</summary>///<param name="queueTypes"></param>///<returns></returns>public object ReceiveOneQueue(Type[] queueTypes){object result = null;if (QueueExist()){using (MessageQueue mq = new MessageQueue(QueuePath)){try{// 设置消息队列的格式化器mq.Formatter = new XmlMessageFormatter(queueTypes);if (mq.CanRead){Message oneMessage = mq.Receive(); // 获得消息队列中第⼀条消息result = oneMessage.Body;}}catch (Exception ex){throw new Exception("Error to query Queue!", ex);}}}return result;}4. 获取队列第⼀条数据,但保留数据///<summary>///获取队列第⼀条数据,但保留数据///</summary>///<param name="queueTypes"></param>///<returns></returns>public object PeekOneQueue(Type[] queueTypes){object result = null;if (QueueExist()){using (MessageQueue mq = new MessageQueue(QueuePath)){try{// 设置消息队列的格式化器mq.Formatter = new XmlMessageFormatter(queueTypes);if (mq.CanRead){Message oneMessage = mq.Peek(); // 获得消息队列中第⼀条消息result = oneMessage.Body;}}catch (Exception ex){throw new Exception("Error to query Queue!", ex);}}}return result;}5. 调⽤程序//远程连接请使⽤FormatName:DIRECT=ftp://222.10.xx.xx/msmq/Private$/msmqpathMSMQUtil.MSMQHelper msmqHelper = new MSMQUtil.MSMQHelper(@".\Private$\msmqpath");msmqHelper.CreateQueue("first msmq", "first lable");msmqHelper.CreateQueue(new msmqtestclass() { age = 25, name = "xieyang", contents = new List<string>() { "my leg", "my head" } });var formater1 = new Type[] { typeof(string) };object obj1 = msmqHelper.ReceiveOneQueue(formater1);var formater2 = new Type[] { typeof(msmqtestclass) };object obj2 = msmqHelper.ReceiveOneQueue(formater2);最常见错误:当链接为远程时,需要给everyone读写权限。

Android平台网络连接架构分析-connectivityservice框架流程word版本

Android平台网络连接架构分析-connectivityservice框架流程word版本

Android平台网络连接架构解析2016-09李国辉ligh6@一概述截止到最新的7.0版本,android网络连接管理系统一直都由四个service组成,分别是ConnectivityService,NetworkPolicyManagerService,NetworkManagementService,NetworkStatsService共同配合完成网络连接和管理功能,其中核心服务是ConnectivityService,而本文也会着重介绍该service的架构,四个service中NetworkPolicyManagerService通过NetworkPolicyManager对外提供SDK接口,而ConnectivityService通过ConnectivityManager对外提供SDK接口,整体的框架图如下:1. ConnectivityService提供数据连接管理服务,负责管理Mobile,WIFI,BT,Ethernet几大类网络连接,同时提供VPN和Tethering服务。

workPolicyManagerService提供网络策略管理服务,NetworkPolicyManagerService维护网络使用策略,策略可以从一个策略文件读取(策略文件保存在系统目录下的netpolicy.xml 文件中)。

也可以通过NetworkPolicyManager对外提供的设置策略接口(setNetworkPolicies及setUidPolicy)进行设置,NetworkPolicyManagerService能够根据这些设置或从策略文件中读取的策略控制网络连接。

另外NetworkPolicyManagerService还具有动态调节网络连接限额及动态设置网络连接的功能,动态调节网络连接限额机制是通过INetworkStatsService访问NetworkStatsService服务获得上面设置或读取的策略匹配的网络连接类型的传输统计信息(NetworkPolicyManagerService采用NetworkTemplate进行网络连接类型的匹配),并根据这些信息生成有效的规则,并提交给ConnectivityService服务,并调用NetworkManagementService 的setInterfaceQuota函数对网络连接的带宽限额。

MSMQ 消息队列简介

MSMQ 消息队列简介

附:MSMQ 消息队列简介1)引用队列引用队列有三种方法,通过路径、格式名和标签引用队列,这里我只介绍最简单和最常用的方法:通过路径引用队列。

队列路径的形式为machinename\queuename。

指向队列的路径总是唯一的。

下表列出用于每种类型的队列的路径信息:如果是发送到本机上,还可以使用”.”代表本机名称。

2)消息的创建不过要使用MSMQ开发你的消息处理程序,必须在开发系统和使用程序的主机上安装消息队列。

消息队列的安装属于Windows组件的安装,和一般的组件安装方法类似。

往系统中添加队列十分的简单,打开[控制面板]中的[计算机管理],展开[服务和应用程序],找到并展开[消息队列](如果找不到,说明你还没有安装消息队列,安装windows组件),右击希望添加的消息队列的类别,选择新建队列即可。

消息接收服务位于System.Messaging中,在初始化时引用消息队列的代码很简单,如下所示:MessageQueue Mq=new MessageQueue(“.\\private$\\jiang”);通过Path属性引用消息队列的代码也十分简单:MessageQueue Mq=new MessageQueue();Mq.Path=”.\\private$\\jiang”;使用Create 方法可以在计算机上创建队列:System.Messaging.MessageQueue.Create(@".\private$\jiang");3) 发送和接收消息过程:消息的创建-》发送-》接收-》阅读-》关闭简单消息的发送示例如下:Mq.Send(1000); //发送整型数据Mq.Send(“This is a test message!”); //发送字符串接收消息由两种方式:通过Receive方法接收消息同时永久性地从队列中删除消息;通过Peek方法从队列中取出消息而不从队列中移除该消息。

Qualcomm平台android开发总结要点

Qualcomm平台android开发总结要点

1、高通平台android开发总结. 71.1 搭建高通平台环境开发环境. 71.2 搭建高通平台环境开发环境. 71.2.1 高通android智能平台概述. 71.2.1.1 什么是L4,REX,BREW,AMSS以及相互之间的关系. 71.2.2 选择合适的源代码以及工具. 81.2.2.1 获取经过高通打补丁的android 源代码. 81.2.2.2 获取高通针对不同处理器的vendor源代码. 91.2.2.3 获取 modem 源代码. 91.2.2.3.1 高通 modem 源代码编译前的修正. 131.2.3 建立 Android 开发环境. 141.2.4 建立 modem 开发环境. 151.2.4.1 补充. 161.2.4.1.1 获取 licenses 161.2.4.1.2 Flex 简单使用指南. 161.2.4.1.3 启动 license 服务器. 181.2.4.1.4 license 没有办法从服务器获取的几种情况. 181.2.4.1.5 破解 rvds 的license 191.2.5 在高通开发板上烧录文件系统. 191.3 高通平台,android和 modem 编译流程分析. 211.3.1 android代码编译流程分析. 211.3.1.1 编译工具检测. 221.3.1.1.1 221.3.1.2 appsboot.mbn 生成过程解析. 221.3.1.3 boot.img 生成过程解析,怎样手动生成 boog.img 281.3.1.4 编译过程存在的问题. 321.3.1.4.1 prelinkmap 的时候 base 0xaff00000 out of range 32 1.3.1.4.2 LOCAL_SDK_VERSION 使应用程序不能访问hide的api 32 1.3.1.4.3 armv5te-vfp 导致一些游戏运行不了. 321.3.2 分布式编译 android 代码. 331.3.3 modem 代码编译流程分析. 331.3.3.1 单独编译某个模块(如:qcsbl oemsbl). 341.3.3.2 $(TARGETDIR)/exist 规则解析. 361.3.3.3 setup规则解析. 361.3.3.3.1 corebsp_create_incpaths 361.3.3.3.2 create_incpaths 361.3.3.3.3 amsssetup 361.3.3.3.4 amsslinkaddress 361.3.3.3.5 firmware 381.3.3.4 deps规则解析. 381.3.3.5 corebsp_build规则解析. 381.3.3.5.1 corebsp_build_action 381.3.3.5.1.1 corebsp_scons 规则. 391.3.3.5.1.1.1 corebsp_scons_start 392.3.3.5.1.1.1 corebsp_scons_action 391.3.3.5.1.1.2.1 命令 pboot_gen_elf image_header pboot_add_hash 解析. 401.3.3.5.1.1.2.2 env.BinBuilder 过程解析. 411.3.3.5.1.1.2.3 env.MbnBuilder 过程解析. 411.3.3.5.1.1.2.4 env.MbnDummyBuilder 过程解析. 421.3.3.5.1.1.2.5 fsbl.mbn 生成过程解析. 431.3.3.5.1.1.2.6 dbl.mbn 生成过程解析. 431.3.3.5.1.1.2.7 AMSS_AABBQOLYM.mbn 生成过程解析. 431.3.3.5.1.1.2.8 adsp.mbn 生成过程解析. 431.3.3.5.1.1.2.9 osbl.mbn 生成过程解析. 441.3.3.5.1.1.2.10 enandprg_AABBQOLYM.mbn 生成过程解析. 441.3.3.5.1.1.2.11 nandprg_AABBQOLYM.mbn 生成过程解析. 451.3.3.5.1.1.2.12 emmcbld.mbn 生成过程解析. 453.3.3.5.1.1.1 corebsp_scons_done 461.3.3.5.1.2 corebsp 461.3.3.5.2 corebsp_create_incpaths 461.3.3.5.3 corebsp_setup 461.3.3.6 libs 461.3.3.7 copybar规则解析. 471.3.3.8 exe规则解析. 471.3.3.8.1 CORELIBS_AABBQOLYM.mbn生成过程解析. 471.3.3.8.2 amss.mbn 生成过程解析. 471.3.3.9 bldprod规则解析. 481.3.3.10 create_mem_feat_html规则解析. 481.3.3.10.1 501.3.3.11 partition规则解析. 501.3.3.11.1 eMCC 启动和 NAND 启动的分区格式是不一样的,如果是 eMCC 启动,多了编译选项:. 501.4 高通平台 7630 启动流程分析. 521.4.1 启动流程概述. 521.4.2 pbl 流程. 521.4.3 dbl 流程. 521.4.4 osbl 流程. 541.4.4.1 osbl 装载 appsbl 过程分析. 561.4.5 appsbl 流程(源代码在 android中). 561.4.5.1 aboot_init 过程分析(需要侧重关心的部分). 581.4.5.1.1 fastboot 模式分析. 611.4.5.1.1.1 什么是 fastboot 模式. 611.4.5.1.1.2 fastboot 模式与 recovery 模式的区别. 611.4.5.1.1.3 怎样进入 fastboot 模式. 621.4.5.1.1.4 android 系统手机刷机过程分析(补充知识) 621.4.5.1.2 appsbl 引导 android 系统. 631.4.5.1.2.1 Android 系统启动过程中存在的问题. 671.4.5.1.1.1.1 linker 问题导致系统无法启动. 67 1.4.6 AMSS 流程. 691.5 android 系统重启关机流程分析. 821.5.1 c语言中调用 reboot 函数. 821.5.2 通过 adb 让系统重启. 821.5.3 fastboot 模式下系统重启. 831.5.4 系统关机. 841.5.5 内核中的系统调用 reboot 851.6 软件调用流程分析. 891.6.1 设置sim卡状态. 891.6.2 设置背光. 901.6.3 获取电池信息. 901.7 python scons 语法学习. 941.8 python 语法学习. 941.8.1 Python中文全攻略. 941.8.2 推荐一款Python编辑器. 941.8.3 使用 pyExcelerator 读 Execl 文件. 94 1.8.4 xlrd 解析 xls 文件. 951.8.5 xlrd 生成 xls 文件. 951.9 Python 语言之 scons 工具流程分析. 951.9.1 Program 方法. 1001.9.2 Library 方法. 1002、高通常用工具使用. 1012.1 QPST 1012.2 QXDM 1012.3 QCAT 1013、工程模式. 1014、 Android 系统更新升级总结. 1044.1 刷机基本知识. 1044.1.1 各品牌代表手机刷机模式进入方法. 1044.1.1.1 HTC G1 1044.1.1.2 三星 Galaxy i7500 1044.1.1.3 Google Nexus One 1054.1.2 fastboot 模式. 1054.1.2.1 fastboot 模式概述. 1054.1.2.2 PC端fastboot 命令分析. 1064.1.2.2.1 命令选项–w –s -p –c 1064.1.2.3 手机端fastboot 命令分析. 1074.1.2.3.1 boot 1074.1.2.3.2 erase 1074.1.2.3.3 flash 1074.1.2.3.4 continue 1074.1.2.3.5 reboot 1074.1.2.3.6 reboot-bootloader 1074.1.2.3.7 getvar 1074.1.2.3.8 download 1084.1.2.3.9 update 1084.1.2.3.9.1 system/core/fastboot/fastboot.c:294: 1084.1.2.3.9.2 fprintf(stderr, "archive does not contain '%s'\n", name); 108 4.1.2.4 fastboot 模式流程分析. 1084.1.3 recovery 模式. 1084.1.3.1 recovery 模式概述. 1084.1.3.2 软件升级包. 1094.1.3.3 recovery v1跟recovery v2的区别. 1094.1.3.4 软件升级脚本语法解析. 1094.1.3.4.1.1 mount 1104.1.3.4.1.2 getprop 1114.1.3.4.1.3 file_getprop 1114.1.3.4.1.4 assert 1114.1.3.4.1.5 format 1114.1.3.4.1.6 apply_patch_check 1114.1.3.4.1.7 apply_patch_space 1114.1.3.4.1.8 apply_patch 1114.1.3.4.1.9 package_extract_file 1124.1.3.4.1.10 ui_print 1124.1.3.4.1.11 META-INF/com/google/android/update-script 脚本分析. 112 4.1.3.4.2 Recovery 模式中 install_package 函数解析. 1174.1.3.5 Recovery 流程分析. 1184.1.3.5.1 恢复出厂设置. 1184.1.3.5.2 系统更新流程. 1194.1.3.5.3 通过sd卡实现刷机. 1214.1.3.6 系统升级包案例分析. 1224.1.4 工程模式(HBoot) 模式. 1224.1.4.1 HBOOT降级方法. 1224.2 如何制作升级包 update.zip 1234.2.1 手动制作升级包. 1234.2.2 自动制作升级包. 1234.3 Android 签名机制. 1254.4 android 文件系统权限概述. 1254.4.1 获取手机root权限. 1274.4.2 adb默认权限分析. 1284.4.3 adb root命令切换到 root 权限. 1294.4.4 挂载系统分区为读写(remount) 1304.4.5 通过修改 boot.img 获取 Nexus One 权限. 1324.5 系统应用移植. 1324.5.1 Android 2.2在线升级的移植. 1324.5.2 解决donut Gtalk、Market登录不了的问题. 1334.5.3 apk反编译问题总结. 1334.5.4 系统重启. 1335、高通linux内核驱动开发. 1335.1 添加串口调试. 1335.2 Sensor 传感器. 1335.3 USB 枚举 USB Composition 1345.4 USB 枚举 USB Composition 1366、从 android 源代码制作 sdk 1366.1 linux sdk 1376.2 windows sdk 1377、程序安装与调试. 1388、 android 框架流程分析. 1388.1 屏幕显示相关. 1388.1.1 屏幕分辨率. 1388.1.2 屏幕模式. 1398.2 Android 开机充电. 1418.3 Android 开机动画. 1418.3.1 内核开机画面. 1418.3.2 文件系统开机画面. 1418.3.2.1 开机显示的 ANDROID 文字. 1418.3.2.2 ANDROID 发光动画. 1428.3.2.3 initlogo.rle 文件分析. 1438.3.2.4 bootanimation.zip 文件分析. 1438.3.3 三星I9000 开机动画. 1448.4 JNI调用流程. 1458.5 Android 开机铃声. 1458.6 GPS 导航. 1458.6.1 GPS导航原理. 1458.6.2 GPS导航软件. 1459、高通modem框架流程分析. 1469.1.1 添加自定义rpc调用. 1469.1.1.1 从AP端获取modem的系统分区信息. 1469.1.2 添加自定义 AT命令. 14610、 linux 应用. 14610.1 嵌入式Linux通过帧缓存截图 - Framebuffer Screenshot in Embedded Linux 14610.2 Linux下右键烧录文件. 14710.3 Linux下右键svn 1471、高通平台android开发总结1.1 搭建高通平台环境开发环境在高通开发板上烧录文件系统建立高通平台开发环境高通平台,android和 modem 编译流程分析高通平台7620 启动流程分析qcril 流程分析,设置sim卡锁python scons 语法学习Python 语言之 scons 工具流程分析:1.2 搭建高通平台环境开发环境高通android智能平台概述选择合适的源代码以及工具建立 Android 开发环境(部分略)建立 modem 开发环境1.2.1 高通android智能平台概述高通 7230 android 智能手机解决方案的软件包括两个部分1. 以linux 操作系统为基础的 android 系统2. 以 L4,REX为基础的 Modem 部分在高通7系列的架构中,一个IC内部集成有两个ARM处理器,一个ARM9(或者arm11),专门负责处理通信协议,射频以及GPIO等,软件架构采用AMSS,另外一个是ARM11,用来处理多媒体,上层应用,以及其他的一些任务,运行的系统是 android 系统,这两个处理器之间通过共享内存的硬件方式来进行通信。

Windows Server Active Directory Rights Management Services 循序渐进指南

Windows Server Active Directory Rights Management Services 循序渐进指南

WindowsServerActiveDirectoryRightsManagementServices循序渐进指南更新时间:2007年12月应用到:WindowsServer2008关于本指南本循序渐进指南将引导您完成在测试环境中设置工作的ActiveDirectory权限管理服务(ADRMS)基础结构的过程。

在该过程中,将创建ActiveDirectory(R)域,安装数据库服务器,安装ADRMS服务器角色,配置ADRMS群集,然后配置启用ADRMS的客户端计算机。

完成这些任务后,您可以使用测试实验室环境了解WindowsServer®2008上的ADRMS技术并评估如何在组织中部署。

完成本指南中的步骤后,您将:∙准备ADRMS基础结构。

∙安装和配置ADRMS。

∙在完成配置后验证ADRMS功能。

ADRMS部署的目标是能够保护任何位置的信息。

将ADRMS保护施加到数字文件后,将一直对该文件提供保护。

默认情况下,只有内容所有者才能够取消对该文件的保护。

所有者授予其他用户对内容执行操作的权限,如查看、复制或打印文件的能力。

有关ADRMS部署蕴藏的商业因素的详细信息,请参阅白皮书“WindowsRightsManagementServices:帮助组织防止未经授权使用数字信息”(http:///fwlink/?LinkId=64636)(可能为英文网页)。

备注本指南未提供的内容本指南未提供以下内容:∙ADRMS概述。

有关ADRMS可以为您的组织带来好处的详细信息,请参阅http:///fwlink/?LinkId=84726(可能为英文网页)。

∙在生产环境中设置和配置ADRMS的指南∙ADRMS的完整技术参考在测试环境中部署ADRMS建议您首先在测试实验室环境中执行本指南中提供的步骤。

不一定必须使用循序渐进指南才能部署WindowsServer功能,而不使用其他部署文档,应将其作为独立的文档谨慎使用。

Win7系统下最大限度降低PING值

Win7系统下最大限度降低PING值

Win7系统下最大限度降低PING值MSMQ一、开启Microsoft Message Queue (MSMQ)服务步骤:1、控制面板:2、程序:3、打开或关闭Windows功能4、找到MSMQ服务器,勾选,确定安装,重新启动二、修改网络延迟1.按下开始,在搜索框中输入"regedit"按确定,打开注册表编辑器。

2.在注册表编辑器里寻找下面字串内的位置[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSMQ/Parameters] 按右键修改TCPNoDelay的REG_DWORD (64位系统下是REG_QWORD)值输入数值为1,如果没有请自行新增名为TCPNoDelay的REG_DWORD (REG_QWORD)值。

找到文件夹位置,然后再右边修改相应的值。

3.查找以下的位置[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/ Tcpip/Parameters/Interfaces/] 在该文件夹下面,查找与你相应ip的项目点击每一项,观察右边中与你相同ip的,就是你要找的那个项目新增名字为TcpAckFrequency的REG_DWORD(64位系统下是REG_QWORD)值,并输入数值为1;*千万不要修改或新增TcpDelAckTicks的REG_DWORD(64位系统下是REG_QWORD)值,这和xp不同切记,仔细检查有没有此项,有的话一定要删除,这点很重要如果想恢复效果,将以上的值删掉即可4.开注册表编辑器(开始-运行-输入REGEDIT),在其中找到“HKEY_LOCAL_MACHINE\System\CurrenControlSet\Services\Tcpip\Parameters”子键,在右边键值区中,找到或新建一个名为“GlobalMaxTcpWindowSize”的DWORD(64位系统下是REG_QWORD)键值项,将其数据值数据设为“256960”(十进制),关闭注册表编辑器,这个更改的原理是:通常情况下,TCP/IP默认的数据传输单元接受缓冲区的大小为576字节,要是将这个缓冲区的大小设置得比较大的话,一旦某个TCP/IP分组数据发生错误时,那么整个数据缓冲区中的所有分组内容,都将被丢失并且进行重新传送;显然不断地重新进行传输,会大大影响ADSL传输数据的效率。

android数据业务激活流程

android数据业务激活流程

android数据业务激活流程本文将介绍数据业务的激活流程,这是上网的前提。

只有通过激活,网络才能分配IP地址、DNS等参数,浏览器、Email等应用才能访问网络。

本文将从应用开启数据开关一直到发OTA消息到网络侧,详细说明这一阶段的调用方法和主要工作。

需要注意的是,本文主要针对Android4.4平台和XXX的MSM8926模块,网络模式主要基于UMTS。

因此,阅读本文时最好有相关代码。

对于非手机开发工程师,也可以了解一下上网的流程。

要对数据业务架构进行了解,可以参考《android数据业务架构(m平台)》。

激活流程的函数调用步骤如下:Step1:ConnectivityManager::XXX该接口是应用可以直接调用的,在setting里开关数据就是首先调用该接口。

主要通过binder调用的是Server端的相应接口。

Step2:ConnectivityService::XXX首先检查权限,调用的进程是否声明了CHANGE_NETWORK_STATE的权限,最后发一个EVENT_SET_MOBILE_DATA的事件以便调用者不阻塞。

处理消息的是方法XXX,调用XXX的setUserDataEnable。

Step3:XXX::XXX通过AsyncChannel,发命令CMD_SET_USER_DATA_ENABLE到dcTrackerBase,在开始初始化的时候就进行关联。

Step4:DcTrackerBase::XXX此步骤是整个激活流程的关键,通过向RIL发送RIL_REQUEST_ALLOW_DATA调用,启动数据连接。

如果激活成功,将会收到RIL_UNSOL_DATA_CALL_LIST_CHANGED的消息。

如果激活失败,将会收到RIL_UNSOL_DATA_CALL_LIST_CHANGED的消息,其中reason字段将会标记失败原因。

收到命令后,会在在onTrySetupData中,会调用XXX。

使用微软消息队列实现C#进程间通信

使用微软消息队列实现C#进程间通信

使用微软消息队列实现C#进程间通信顾名思义微软消息队列(MSMQ)是一种给队列发送消息以便稍后进行处理的方法消息由一个Producer (生产者)应用程序发送出去再由一个 Consumer (消费者)应用程序返回这两个应用程序可以在同一台机器上在整个网络中或甚至是位于并不总是连接在一起的不同机器上MSMQ具有故障保险特性因为如果第一次传送失败它会重新发送消息这样可保证你的应用程序消息到达它们的目的地我将应用一个叫做T echRepublic 的队列当你运行本文下载版本中的样本实例时如果这个队列不存在它会自动建立在前面的一篇文章中 Zach Smith说明了如何使用IPC通道在同一台机器上的两个进程间通信他将在本文中说明如何在同一台机器或网络上的应用程序间实现进程间通信访问MSMQ通过 NET访问队列由System Messaging MessageQueue对象完成列表A说明了如何在一台名为 SRV MESSAGING 的计算机上访问TechRepublic队列列表AMessageQueue queue = new MessageQueue( SRV MESSAGINGTechRepublic );注要应用这个对象你必须在你的项目中添加一个参考现在我们有了一个MessageQueue对象这个对象为你提供与队列交互需要的所有功能如果队列不存在你可以调用MessageQueue对象的静态Create 方法编程建立队列列表B中的代码说明如何检查队列是否存在建立队列或给队列添加一个参考列表BMessageQueue queue = null;string queueName = SRV MESSAGINGTechRepublic ;if (MessageQueue Exists(queueName))queue = newMessageQueue(queueName);elsequeue = MessageQueue Create(queueName false);改写队列改写队列时用到MessageQueue Send方法列表C举例说明如何向TechRepublic队列发送一条消息列表Cqueue Send( My message body Message Label );在这个例子中我们给TechRepublic队列发送一条正文为My message body 的消息并对这个消息应用了一个 Message Label 标签消息标签允许你不需阅读消息正文就可以分割消息如果从计算机管理控制台中查看队列还可在队列消息部分看到这些标签读取队列可以使用几种方法从队列中读取消息最常见的情况是从队列中取出所有消息然后一次性处理它们这时要调用MessageQueue GetAllMessages方法列表D举例说明如何应用这个方法列表D System Messaging Message[] messages = queue GetAllMessages();foreach (System Messaging Message message in messages) {//Do something with the message}你也可以用GetMessageEnumerator 方法代替上面的MessageQueue GetAllMessages方法虽然这两个方法的用法类似但GetMessageEnumerator 只能向前(forward only)对于非常庞大的队列则应用使用这个方法而不是MessageQueue GetAllMessages方法这是因为GetAllMessages方法领取所有消息把它们保存在当地内存中而GetMessageEnumerator 方法只领取当前消息在本地保存在调用MoveNext时才领取下一条消息列表E举例说明了GetMessageEnumerator 方法的用法这段代码检查队列中的每一条消息再删除它列表EMessageEnumerator enumerator = queue GetMessageEnumerator ();while (enumerator MoveNext())enumerator RemoveCurrent();在使用GetMessageEnumerator 方法时还要考虑另外一个问题即你要访问队列中增加的任何新消息即使它们是在你调用GetMessageEnumerator 后再增加的这假定新消息被添加到队列末尾如果你只希望返回队列中的第一条消息你应该使用MessageQueue Receive方法这个方法会领取队列中的第一条消息在这个过程中将它从队列中删除由于消息在读取的时候被删除你可以确保你的进程是唯一收到消息的进程 Receive方法的应用实例如列表F 所示列表FSystem Messaging Message message = queue Receive();可以用Peek方法代替Receive方法 Peek方法像Receive方法一样领取队列中的第一条消息但是它在队列中保留消息备份这允许你从队列中删除消息之前检查消息内容 Peek的语法与Receive类似列表GSystem Messaging Message message = queue Peek();发送/接收序列化对象虽然给队列发送文本的功能非常有用但队列还允许你发送可序列化对象这意味着你可以建立一个自定义的NET类实例化它的一个实例将其发送给队列以便其它应用程序使用要完成这个过程首先得使用XML Serializer序列化被发送的对象然后对序列化对象放到消息的正文中例如假设我们希望给TechRepublic消息队列发送以下对象(列表H)列表H[Serializable()]publicclassMessageContent{privateDateTime _creationDate = DateTime Now;privatestring _messageText;public MessageContent(){}public MessageContent(string messageText){_messageText = messageText;}publicstring MessageText{get { return _messageText; }set { _messageText = value; }}publicDateTime CreationDate{get { return _creationDate; }set { _creationDate = value; }}}给队列发送这个对象的一个实例只需简单调用MessageQueueSend方法并把一个对象实例作为参数提交给这个方法列表I说明了这种情况列表IMessageContent message = newMessageContent( Hello world! );queue Send(message Sample Message );如你所见上面的代码类似于我们前面发送正文为一个字符串的消息时使用的代码接收一个包含序列化对象的消息更加困难一些我们需要告诉消息它包含哪种对象为向消息指出它包含哪种对象我们必须建立消息的格式化器(formatter)给消息的Formatter属性指定一个System Messaging XmlMessageFormatter对象即可建立格式化器由于我们的消息包含一个MessageContent对象我们希望为它配置XmlMessageFormatter列表Jmessage Formatter = new System Messaging XmlMessageFormatter(newType[ ] { typeof(MessageContent) });既然我们已经给消息指定了一个格式化器我们可以从消息中提取MessageContent对象但在这之前我们需要把message Body属性的返回值分配给一个MessageContent对象列表KMessageContent content = (MessageContent)message Body;在这个例子中content 变量是我们向队列发送的原始MessageContent对象的序列化版本我们可以访问原始对象的所有属性和值设定消息优先级别在正常情况下队列中的消息以先进先出的形式被访问这表示如何你先发送消息A 再发送消息B 那么队列将首先返回消息A 然后才是消息B 在多数情况下这样处理没有问题但是有时由于一条消息比其它消息更加重要你希望将它提到队列前面要实现这种功能你就需要设定消息优先级别一条消息的优先级别由它的Message Priority属性值决定下面是这个属性的所有有效值(全部来自MessagePriority的列举类型)·最高(Highest)·非常高(VeryHigh)·高(High)·高于正常级别(AboveNormal)·正常(Normal)·低(Low)·非常低(VeryLow)·最低(Lowest)消息在队列中的位置由它的优先级别决定——例如假如队列中有四条消息两条消息的优先级别为正常(Normal)另两条为高(High)则队列中消息排列如下·High Priority A——这是发送给队列的第一条高优先级消息·High Priority B——这是发送给队列的第二条高优先级消息·Normal Priority A——这是发送队列的第一条正常优先级消息·Normal Priority B——这是发送队列的第二条正常优先级消息根据这个顺序如果我们给队列发送另一条最高优先级的消息它将位于队列的顶部如果需要使用消息优先级功能你必须修改发送消息的代码因为Message对象的构造器没有指定消息优先级别的功能你必须实例化一个Message对象并在将它发送给队列之前给它设定相应的属性列表L中的代码说明如何设定优先级别并给队列发送一条最高优先级别的消息列表L//Instantiate the queueMessageQueue queue = newMessageQueue(queueName);//Create a XmlSerializer for the object type we re sending XmlSerializer serializer = newXmlSerializer(typeof(MessageContent));//Instantiate a new messageSystem Messaging Message queueMessage =new System Messaging Message();//Set the priority to HighestqueueMessage Priority = MessagePriority Highest;//Create our MessageContent objectMessageContent messageContent =newMessageContent( Hello world IMPORTANT! );//Serialize the MessageContent object into the queueMessageserializer Serialize(queueMessage BodyStream messageContent);//Send the messagequeue Send(queueMessage HIGH PRIORITY );这段代码和上面代码的最明显区别在于它使用了XmlFormatter 它实际是可选的列表L中的代码也可用列表M中的代码代替列表M//Instantiate a new messageSystem Messaging Message queueMessage =new System Messaging Message();//Set the priority to HighestqueueMessage Priority = MessagePriority Highest;//Create our MessageContent objectMessageContent messageContent =newMessageContent( Hello world IMPORTANT! );//Set the body as the messageContent objectqueueMessage Body = messageContent;//Send the messagequeue Send(queueMessage HIGH PRIORITY );这段代码执行和列表L中的代码相同的任务但代码更少应用输入消费者请求是MSMQ功能的一个简单实例消费者提出一个请求由一个面向消费者的应用程序将它送交给消息队列向队列发送请求后它会向消费者送出一个确认(acknowledgement)然后一个独立的进程从队列中提取消息并运行任何所需的业务逻辑(business logic)完成业务逻辑后处理系统将向另一个队列提交一个响应接下来面向消费者的应用程序从队列中提取这个响应并给消费者返回一个响应lishixinzhi/Article/program/net/201311/13471。

使用windows服务和MSMQ和进行日志管理(解决高并发问题)

使用windows服务和MSMQ和进行日志管理(解决高并发问题)

使⽤windows服务和MSMQ和进⾏⽇志管理(解决⾼并发问题)⾸先,建⽴⼀个windows服务项⽬然后进⾏设计视图在⼯作区空⽩处右属,添加⼀个安装项⽬然后就可以写我们的代码了,我们的服务需要实时监视MSMQ的队列中有没有记录,如果有,就向数据库中插⼊核⼼代码如下///<summary>///接收来⾃MSMQ的消息,并保存到数据库///</summary>public class MessageQueueService{public static bool blnStopThread;public static string exTemp = string.Empty;public MessageQueueService(){//// TODO: 在此处添加构造函数逻辑//}public static void Start(){string queuePath = ".\\Private$\\zzl";IsQueueExists(queuePath);MessageQueue myQueue = new MessageQueue(queuePath);myQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(Log) });do{try{// Receive and format the message.Message myMessage = myQueue.Receive(); //当消息队列空时,线程会挂起Log log = (Log)myMessage.Body;if (log == null) return;Save(log);//保存到数据库,此处略详细代码}catch (System.Exception ex){//异常处理//……}} while (blnStopThread == false);}private static void IsQueueExists(string path){if (!MessageQueue.Exists(path)){MessageQueue.Create(path);}}private static void Save(Log entity){using (SqlConnection sqlconn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["conn"].ToString())){using (SqlCommand sqlcomm = new SqlCommand("INSERT INTO [Web_Logs]([LogID],[FromURL],[ExeSQL],[FromSystem],[HttpMethod],[OccurTime],[info]) VALUES (@LogID,@FromURL,@ExeSQL,@FromSystem,@HttpMethod,@OccurTime,@Info); , sqlconn)){SqlParameter parameter = new SqlParameter("@ExceptionID", SqlDbType.VarChar, 36);parameter.Value = Guid.NewGuid().ToString();sqlcomm.Parameters.Add(parameter);parameter = new SqlParameter("@LogID", SqlDbType.VarChar, 36);parameter.Value = entity.ID;sqlcomm.Parameters.Add(parameter);parameter = new SqlParameter("@FromURL", SqlDbType.VarChar, 200);parameter.Value = string.Empty;sqlcomm.Parameters.Add(parameter);parameter = new SqlParameter("@ExeSQL", SqlDbType.VarChar, 1000);parameter.Value = string.Empty;sqlcomm.Parameters.Add(parameter);parameter = new SqlParameter("@FromSystem", SqlDbType.Int);parameter.Value = 1;sqlcomm.Parameters.Add(parameter);parameter = new SqlParameter("@HttpMethod", SqlDbType.VarChar, 50);parameter.Value = string.Empty;sqlcomm.Parameters.Add(parameter);parameter = new SqlParameter("@Info", SqlDbType.VarChar, 50);parameter.Value = ;sqlcomm.Parameters.Add(parameter);parameter = new SqlParameter("@OccurTime", SqlDbType.DateTime);parameter.Value = entity.OccerTime;sqlcomm.Parameters.Add(parameter);sqlconn.Open();sqlcomm.ExecuteNonQuery();sqlconn.Close();}}}public class Log{public string ID { get; set; }public string Info { get; set; }public DateTime OccerTime { get; set; }public void PrintAll(){Console.WriteLine("{0} {1} {2}", ID, Info, OccerTime);}}为了使服务实时对MSMQ进⾏监控,需要我们在服务中使⽤⼀个定时事件,代码如下:当然在程序初始化时,需要为⼀个System.Timers.Timer类型进⾏相应的初始化⼯作this.timer1 = new System.Timers.Timer();this.timer1.Start();this.timer1.Interval = 1000;this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Elapsed);这个WINDOWS服务我们已经添加完成,现在需要做的就是MSMQ部分了,事实上windows服务这块主要是从MSMQ中得到消息,⽽在MSMQ这块主要是向MSMQ去写⼊消息,微软的MSMQ完全⽀持复杂类型,也就是说你可以将⼀个类对象写到MSMQ中///<summary>///⽇志实体///可以被序列化///</summary>[Serializable()]public sealed class Log{public string ID { get; set; }public string Info { get; set; }public DateTime OccerTime { get; set; }}///<summary>///MSMQ消息功能密封类///向消息队列中写⼊⽇志信息///</summary>public sealed class MSMQLog{private static object sync = new object();private static object syncWrite = new object();static volatile MessageQueue writer = null;private static MessageQueue MSQWriter{get{if (writer == null){lock (sync){if (writer == null){string queuePath = ".\\Private$\\zzl";IsQueueExists(queuePath);writer = new MessageQueue(queuePath);}}}return writer;}}private static void IsQueueExists(string path){if (!MessageQueue.Exists(path)){MessageQueue.Create(path);}}public static void Write(Log log){lock (syncWrite){MSQWriter.Send(log);}}}当需要调⽤它时,可以这样:本例经过⾃⼰实验,已经成功,当若⼲客户端同时进⾏某种操作时,可以同时写⼊数据库中,这就是我要说的,进⾏window服务和MSMQ技术实现⾼并发的解决⽅案。

消息队列MSMQ的使用实例

消息队列MSMQ的使用实例

消息队列MSMQ的使⽤实例 消息队列:是在消息传输过程中保存消息的容器。

MSMQ是Microsoft的消息处理技术,运⾏平台为Microsoft Windows操作系统。

它分为⽤户队列和系统队列。

在⽤户队列中⼜分为专⽤队列:不在整个⽹络中发布,仅在所驻留的本地计算机上可⽤。

专⽤队列只能由知道队列的完整路径名或标签的⽤户程序访问。

关于消息队列的安装,可以通过控制⾯板->添加/删除程序->添加/删除 Windows 组件。

选择“消息队列”并单击“详细信息”。

如果运⾏的是 Windows Server 2003,请选择“应⽤程序服务器”来访问消息队列。

确保包括“MSMQ HTTP ⽀持”在内的所有选项在详细信息页上均处于选定状态。

单击“确定”退出详细信息页,然后单击“下⼀步”。

完成安装。

这⾥我们通过实例来说明如何创建队列、发送消息、接收消息。

创建队列:创建本机队列:@".\private$\队列名称"创建远程队列:@"FormatName:DIRECT=TCP:远程机器IP\private$\队列名称"实例化消息队列///<summary>///实例化消息队列///</summary>///<param name="isLocalComputer">是否为本机</param>public MSMQManager(bool isLocalComputer){if (isLocalComputer){_path = @".\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ");}else{_path = @"FormatName:DIRECT=TCP:192.168.1.125\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ");}_msmq = new MessageQueue(_path);}创建队列///<summary>///创建队列///</summary>///<param name="transactional">是否启⽤事务</param>///<returns></returns>public bool Create(bool transactional){if (MessageQueue.Exists(@".\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ"))){return true;}else{if (MessageQueue.Create(@".\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ"), transactional) != null){return true;}else{return false;}}}发送消息队列///<summary>///发送消息队列///</summary>///<param name="msmqIndex">消息队列实体</param>///<returns></returns>public void Send(MSMQIndex msmqIndex){_msmq.Send(new Message(msmqIndex, new BinaryMessageFormatter()));}接收消息队列,删除队列///<summary>///接收消息队列,删除队列///</summary>///<returns></returns>public MSMQIndex ReceiveAndRemove(){MSMQIndex msmqIndex = null;_msmq.Formatter = new BinaryMessageFormatter();Message msg = null;try{msg = _msmq.Receive(new TimeSpan(0, 0, 1));}catch(Exception ex){Console.WriteLine(ex.Message);}if (msg != null){msmqIndex = msg.Body as MSMQIndex;}return msmqIndex;} 以上代码⼤致说明了消息队列的创建、发送与接收,下⾯给出消息队列管理器的全部代码。

msqid生成规则

msqid生成规则

msqid生成规则
一、消息队列标识符
消息队列标识符(msqid)是用于标识消息队列的唯一标识符。

在消息队列系统中,每个消息队列都有一个唯一的msqid,用于区分不同的消息队列。

二、消息队列创建
当创建一个新的消息队列时,系统会为该消息队列分配一个唯一的msqid。

该msqid是在系统级别生成的,每个系统中的消息队列msqid都是唯一的。

三、消息队列打开
当一个进程需要访问一个已存在的消息队列时,需要使用相应的msqid来打开该消息队列。

在打开消息队列时,系统会检查该msqid 是否有效,以及该进程是否有权限访问该消息队列。

四、消息队列关闭
当一个进程完成对消息队列的操作后,需要使用相应的msqid来关闭该消息队列。

在关闭消息队列时,系统会释放该消息队列所占用的资源,并清除该msqid所对应的消息队列。

总之,msqid是消息队列系统中的重要标识符,用于标识不同的消息队列,并在创建、打开和关闭消息队列时使用。

在消息队列系统中,每个msqid都是唯一的,以确保每个消息队列的唯一性和可识别性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

创建基于MSMQ的Responsive Service一、One-way MEP V.S. Responsible Service我们知道MSMQ天生就具有异步的特性,它只能以One-way的MEP(Message Exchange Pattern)进行通信。

Client和Service之间采用One-way MEP的话就意味着Client调用Service 之后立即返回,它无法获得Service的执行结果,也无法捕捉Service运行的Exception。

下图简单表述了基于MSMQ的WCF Service中Client和Service的交互。

但是在有些场景中,这是无法容忍的。

再拿我在上一篇文章的Order Delivery的例子来说。

Client向Service提交了Order,却无法确认该Order是否被Service正确处理,这显然是不能接受的。

我们今天就来讨论一下,如何创建一个Responsive Service来解决这个问题:Client 不再是对Service的执行情况一无所知,它可以获知Order是否被Service正确处理了。

二、Solution虽然我们的目的很简单:当Client向Service递交了Order之后,能以某种方式获知Order 的执行结果;对于Service端来说,在正确把Order从Message Queue中获取出来、并正确处理之后,能够向Order的递交者发送一个Acknowledge Message。

为了简单起见,这个Acknowledge Message包含两组信息:Order No.: 被处理的Order的一个能够为一标志它的ID。

Exception: 如果处理失败的Exception,如果成功处理为null。

要在WCF中实现这样的目的,对于Request/Reply MEP来说是简单而直接的:Client向Service 递交Order,并等待Service的Response,Service在处理接收到Order之后直接将处理结果返回给Client就可以了。

但是我们说过MSMQ天生就是异步的,我们只有采取一种间接的方式实现“曲线救国”。

我们的解决方案是:在每个Client Domain也创建一个基于MSMQ的本地的WCF Service,用于接收来自Order处理端发送的Acknowledge Message。

对于处理Order 的Service来说,在正确处理Order之后,想对应的Client发送Acknowledge Message。

下图简单演示整个过程:三、Implementation了解了上面的Solution之后,我们来看看该Solution在真正实现过程中有什么样的困难。

对于处理Order的Service来说,在向Client端发送Acknowledge Message的时候,它必须要知道该Order对应的Client的Response Service的MSMQ的Address以及其他和Operation相关的Context信息(在这里我们不需要,不过考虑到扩展性,我们把包括了address的Context 的信息封装到一个了Class中,在这里叫做:OrderResponseContext)。

而这些Context却不能在Configuration中进行配置,因为他可以同时面临着很多个Client:比如每个Client用于接收Response 的Message Queue的address都不一样。

所以这个OrderResponseContext必须通过对应的Client来提供。

基于此,我们具有两面两种解决方式:方式一、修改Service Contract,把OrderResponseContext当成是Operation的一个参数这是我们最容易想到的,比如我们原来的Operation这样定义:namespace Artech.ResponsiveQueuedService.Contract{[ServiceContract][ServiceKnownType(typeof(Order))]public interface IOrderProcessor{[OperationContract(IsOneWay = true)]void Submit(Order order);}}现在变成:namespace Artech.ResponsiveQueuedService.Contract{[ServiceContract][ServiceKnownType(typeof(Order))]public interface IOrderProcessor{[OperationContract(IsOneWay = true)]void Submit(Order order, OrderResponseContext responseContext);}}虽然这种方式看起来不错,但是却不值得推荐。

在一般情况下,我们的Contract需要是很稳定的,一经确定就不能轻易更改,因为Contract是被交互的多方共同支持的,牵一发动全身;此外,从Service Contract代表的是Service的一个Interface,他是对业务逻辑的抽象、和具体实现无关,而对于我们的例子来说,我们仅仅是定义一个递交Order的Operation,从业务逻辑来看,OrderResponseContext和抽象的业务逻辑毫无关系。

基于此,我们需要寻求一种和Service Contract无关的解决方式:方式二、将OrderResponseContext放到Soap Message 的Header中其实我们要解决的问题很简单,就是要把OrderResponseContext的信息置于Soap Message 中发送到Service。

而我们知道,Soap的Header具有极强的可伸缩性,原则上,我们可以把任何控制信息置于Header中。

基于WCF的编程模式很容易地帮助我们实现对Soap Header 的插入和获取:我们可以通过下面的方式获得当前Operation Context的Incoming Message Headers和Outgoing Message HeadersOperationContext.Current.IncomingMessageHeadersOperationContext.Current.OutgoingMessageHeaders如果我们要把一个OrderResponseContext 对象插入到当前Operation Context的Outgoing Message Headers中,我们可以通过下面的代码来实现:OrderResponseContext context = new OrderResponseContext();MessageHeader<OrderResponseContext> header = new MessageHeader<OrderResponseContext>( context);OperationContext.Current.OutgoingMessageHeaders.Add(header.GetUntypedHeader("name", "namespace"));相应的,我们可以通过下面的代码从Outgoing Message Headers OrderResponseContext的数据获取的内容:OrderResponseContext context = OperationContext.Current.IncomingMessageHeaders.GetHeader<OrderResponseContext>("name ", "namespace"));四、Sample我们照例给出一个完整的Sample,下面是整个Solution的结构:除了一贯使用的4层结构(Contract-Service-Hosting-Client),还为ResponseService增加了下面两层:Localservice: 作为Client Domain的ResponseService。

LocalHosting:Host Localservice。

1.Contract: Artech.ResponsiveQueuedService.ContractService Contract: Artech.ResponsiveQueuedService.Contract. IOrderProcessorusing System;using System.Collections.Generic;using System.Text;using System.ServiceModel;namespace Artech.ResponsiveQueuedService.Contract{[ServiceContract][ServiceKnownType(typeof(Order))]public interface IOrderProcessor{[OperationContract(IsOneWay = true)]void Submit(Order order);}}Service Contract: Artech.ResponsiveQueuedService.Contract.IOrderRessponseusing System;using System.Collections.Generic;using System.Text;using System.ServiceModel;namespace Artech.ResponsiveQueuedService.Contract{[ServiceContract]public interface IOrderRessponse{[OperationContract(IsOneWay =true)]void SubmitOrderResponse(Guid orderNo,FaultException exception);}}接收来自Order processing端的Response:Order No.和Exception。

Data Contract: Artech.ResponsiveQueuedService.Contract.Orderusing System;using System.Collections.Generic;using System.Text;using System.Runtime.Serialization;namespace Artech.ResponsiveQueuedService.Contract{[DataContract]public class Order{Private FieldsConstructorsPublic PropertiesPublic Methods}}对Order的封装。

相关文档
最新文档