收藏 分销(赏)

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

上传人:pc****0 文档编号:8538674 上传时间:2025-02-17 格式:DOC 页数:4 大小:36.50KB 下载积分:10 金币
下载 相关 举报
WCF MSMQ - 2. 队列与事务.doc_第1页
第1页 / 共4页
WCF MSMQ - 2. 队列与事务.doc_第2页
第2页 / 共4页


点击查看更多>>
资源描述
[WCF MSMQ] 2. 队列与事务 [ 2007-05-04 11:45:03 | 作者: yuhen ] 字号: 大 | 中 | 小 MSMQ 支持两种类型的队列,事务性队列(transactional queue)会将消息持久(persiste)存储到磁盘中,即便服务器当机(shutdown)、重启(reboot)或崩溃(crash),消息依然可以在系统恢复后被读取。同时,消息发布、获取和删除都在环境事务范围内,从而确保消息的可靠性。我们还可以使用 TransactionScope 将环境事务传递给队列,否则队列会自动创建一个内部事务。非事务性队列(nontransactional volatile queues)只是将消息存在内存,不会使用磁盘进行持久存储,且不会使用事务来保护对消息的操作。一但服务器发生问题,或者调用方出现异常,消息都会丢失。 // 创建事务性队列 MessageQueue.Create(@".\private$\myqueue", true); // 创建非事务性队列 MessageQueue.Create(@".\private$\myqueue"); 通过下面的例子我们会看到事务失败时,没有任何消息被写入队列。 [ServiceContract] public interface IService {   [OperationContract(IsOneWay = true)]   void Test(int i); } [ServiceBehavior] public class MyService : IService {   [OperationBehavior]   public void Test(int i)   {     Console.WriteLine(i);   } } public class WcfTest {   public static void Test()   {     if (!MessageQueue.Exists(@".\private$\myqueue"))     {       MessageQueue.Create(@".\private$\myqueue", true);     }     IService client = ChannelFactory<IService>.CreateChannel(       new NetMsmqBinding(NetMsmqSecurityMode.None),       new EndpointAddress("net.msmq://localhost/private/myqueue"));     try     {       using (TransactionScope scope = new TransactionScope())       {         using (client as IDisposable)         {           for (int i = 0; i < 10; i++)           {             client.Test(i);             if (i > 5) throw new Exception();           }         }         scope.Complete();       }     }     catch     {     }     AppDomain.CreateDomain("Server").DoCallBack(delegate     {       ServiceHost host = new ServiceHost(typeof(MyService),         new Uri("net.msmq://localhost/private/myqueue"));       host.AddServiceEndpoint(typeof(IService), new NetMsmqBinding(NetMsmqSecurityMode.None), "");       host.Open();     });   } } 这里需要对 "消息" 做一个澄清,当客户端发出调用(call)时,调用会被转换成 WCF Message,然后被包装到 MSMQ Message 中。如果客户端事务完成提交,那么 MSMQ Message 会被传递到队列并存储起来。相反,如果事务失败,消息会被丢弃。上面的例子中,我们将多个调用放到一个环境事务中,也可以将多个服务调用放到一个事务当中。如果队列服务不在当前机器上,也就是说使用 Public Queue 时,客户端的消息队列组件将承担 "代理(proxy)" 的角色。客户端的调用会首先存储到本地队列,然后再由本地队列转发给目标队列。这个转发过程同样受到事务保护。下图很好地对事务性队列操作做了个说明。 要是开发非事务性消息队列服务,需要用到 NetMsmqBinding 的两个属性。将 Durable 设为 false,表示不使用事务方式访问消息队列。另外还得将 ExactlyOnce 设为 false,否则会抛出 InvalidOperationException 异常。 下面例子中,重启消息队列服务(Message Queuing)后,你会发现消息丢失。 [ServiceContract] public interface IService {   [OperationContract(IsOneWay = true)]   void Test(int i); } [ServiceBehavior] public class MyService : IService {   public MyService()   {     Console.WriteLine("Constructor...");   }   [OperationBehavior(TransactionScopeRequired=true)]   public void Test(int i)   {     Console.WriteLine(i);   } } public class WcfTest {   public static void Test()   {     MessageQueue.Delete(@".\private$\myqueue");     MessageQueue.Create(@".\private$\myqueue");     NetMsmqBinding binding1 = new NetMsmqBinding(NetMsmqSecurityMode.None);     binding1.Durable = false;     binding1.ExactlyOnce = false;     IService client = ChannelFactory<IService>.CreateChannel(binding1,       new EndpointAddress("net.msmq://localhost/private/myqueue"));     using (client as IDisposable)     {       for (int i = 0; i < 10; i++)       {         client.Test(i);       }     }     Console.WriteLine("重启MSMQ服务,然后按任意键继续...");     Console.ReadKey(true);     AppDomain.CreateDomain("Server").DoCallBack(delegate     {       NetMsmqBinding binding2 = new NetMsmqBinding(NetMsmqSecurityMode.None);       binding2.Durable = false;       binding2.ExactlyOnce = false;       ServiceHost host = new ServiceHost(typeof(MyService),         new Uri("net.msmq://localhost/private/myqueue"));       host.AddServiceEndpoint(typeof(IService), binding2, "");       host.Open();     });   } }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服