WCF MSMQ - 2. 队列与事务.doc

WCF MSMQ - 2. 队列与事务.doc

ID:48475465

大小:36.50 KB

页数:4页

时间:2020-02-04

WCF MSMQ - 2. 队列与事务.doc_第1页
WCF MSMQ - 2. 队列与事务.doc_第2页
WCF MSMQ - 2. 队列与事务.doc_第3页
WCF MSMQ - 2. 队列与事务.doc_第4页
资源描述:

《WCF MSMQ - 2. 队列与事务.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、[WCFMSMQ]2.队列与事务[2007-05-0411:45:03

2、作者:yuhen]字号:大

3、中

4、小MSMQ支持两种类型的队列,事务性队列(transactionalqueue)会将消息持久(persiste)存储到磁盘中,即便服务器当机(shutdown)、重启(reboot)或崩溃(crash),消息依然可以在系统恢复后被读取。同时,消息发布、获取和删除都在环境事务范围内,从而确保消息的可靠性。我们还可以使用TransactionScope将环境事务传递给队列,否则队列会自动创建一个内

5、部事务。非事务性队列(nontransactionalvolatilequeues)只是将消息存在内存,不会使用磁盘进行持久存储,且不会使用事务来保护对消息的操作。一但服务器发生问题,或者调用方出现异常,消息都会丢失。//创建事务性队列MessageQueue.Create(@".private$myqueue",true);//创建非事务性队列MessageQueue.Create(@".private$myqueue");通过下面的例子我们会看到事务失败时,没有任何消息被写入队列。[

6、ServiceContract]publicinterfaceIService{  [OperationContract(IsOneWay=true)]  voidTest(inti);}[ServiceBehavior]publicclassMyService:IService{  [OperationBehavior]  publicvoidTest(inti)  {    Console.WriteLine(i);  }}publicclassWcfTest{  publicstaticv

7、oidTest()  {    if(!MessageQueue.Exists(@".private$myqueue"))    {      MessageQueue.Create(@".private$myqueue",true);    }    IServiceclient=ChannelFactory.CreateChannel(      newNetMsmqBinding(NetMsmqSecurityMode.None),      newEndpoi

8、ntAddress("net.msmq://localhost/private/myqueue"));    try    {      using(TransactionScopescope=newTransactionScope())      {        using(clientasIDisposable)        {          for(inti=0;i<10;i++)          {            client.Test(i);            i

9、f(i>5)thrownewException();          }        }        scope.Complete();      }    }    catch    {    }    AppDomain.CreateDomain("Server").DoCallBack(delegate    {      ServiceHosthost=newServiceHost(typeof(MyService),        newUri("net.msmq://local

10、host/private/myqueue"));      host.AddServiceEndpoint(typeof(IService),newNetMsmqBinding(NetMsmqSecurityMode.None),"");      host.Open();    });  }}这里需要对"消息"做一个澄清,当客户端发出调用(call)时,调用会被转换成WCFMessage,然后被包装到MSMQMessage中。如果客户端事务完成提交,那么MSMQMessage会被传递到队列并存

11、储起来。相反,如果事务失败,消息会被丢弃。上面的例子中,我们将多个调用放到一个环境事务中,也可以将多个服务调用放到一个事务当中。如果队列服务不在当前机器上,也就是说使用PublicQueue时,客户端的消息队列组件将承担"代理(proxy)"的角色。客户端的调用会首先存储到本地队列,然后再由本地队列转发给目标队列。这个转发过程同样受到事务保护。下图很好地对事务性队列操作做了个说明。要是开发非事务性消息队列服务,需要用到NetMsmqBinding的两个属性。将Durable设为false,表示不

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。