[聚合文章] WCF-MessageQueue-getstarted-demo

消息系统 2017-10-10 19 阅读

背景介绍

消息队列(MSMQ)在WCF中又进一步做了封装,实现了服务端未在线时,客户端发送的消息缓存在消息队列中,等服务端再次启动时,自动接收消息的功能。

Demo

服务端结构

业务模型 OrderEntry

 
[DataContract]
    public class OrderEntry
    {
        [DataMember]
        public int OrderID { get; set; }
        [DataMember]
        public DateTime OrderDate { get; set; }
        [DataMember]
        public int Quantity { get; set; }
        [DataMember]
        public int UnitPrice { get; set; }
 
        public override string ToString()
        {
            return string.Format(
                "ID:{0}\tDate:{1}\tQuantity:{2}\tUnitPrice:{3}\t",
                OrderID,
                OrderDate,
                Quantity,
                UnitPrice);
        }
    }
 

服务契约

 
[ServiceContract]
    public interface IMSMQService
    {
        [OperationContract(IsOneWay = true)]
        void PlaceOrder(OrderEntry entry);
    }
 
 

实现契约的服务

 
    public class MSMQService : IMSMQService
    {
        #region IMSMQService 成员
 
        public void PlaceOrder(OrderEntry entry)
        {
            Console.WriteLine("收到订单:{0}", entry.ToString());
        }
 
        #endregion
    }
 

另启动一个控制台app,host刚才的WCF服务。

 
class Program
    {
        static void Main(string[] args)
        {
            ServiceHost _selfHost = null;
            try
            {
                //step 0 create MessageQueue instance
                string queueName = @".\Private$\ReportService";
                MessageQueue mq = null;
                if (!MessageQueue.Exists(queueName))
                    mq = MessageQueue.Create(queueName);
 
                // Step 1 Create a URI to serve as the base address.
                //This address is the service address and client referes it
                Uri baseAddress = new Uri("net.msmq://localhost/private/ReportService");
 
                // Step 2 Create a ServiceHost instance
                _selfHost = new ServiceHost(typeof(MSMQService), baseAddress);
 
                // Step 3 Add a service endpoint for host instance.
                NetMsmqBinding queBinding = new NetMsmqBinding(NetMsmqSecurityMode.None);
                queBinding.ExactlyOnce = false;
                queBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
                _selfHost.AddServiceEndpoint(typeof(IMSMQService), queBinding, "");
 
                // Step 4 Enable metadata exchange.
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = false;
                _selfHost.Description.Behaviors.Add(smb);
 
                // Step 5 Start the service.
                _selfHost.Open();
                Console.WriteLine("服务器已经准备好");
                Console.Read();
 
            }
            catch (CommunicationException ce)
            {
                Console.WriteLine("An exception occurred: {0}", ce.Message);
                _selfHost.Abort();
            }
        }
    }
 
 

客户端结构

客户端建立一个控制台app,并添加对以上服务的引用,连续发送3个订单,并不启动服务端。

 
class Program
    {
        static void Main(string[] args)
        {
            NetMsmqBinding binding = new NetMsmqBinding(NetMsmqSecurityMode.None);
            binding.ExactlyOnce = false;
            binding.Durable = true;
 
 
            ChannelFactory<IMSMQService> channel =
                new ChannelFactory<IMSMQService>(
                    binding, new EndpointAddress("net.msmq://localhost/Private/ReportService"));
 
            IMSMQService client = channel.CreateChannel();
            client.PlaceOrder(
                new OrderEntry()
                {
                    OrderID = 1,
                    OrderDate = DateTime.Now,
                    UnitPrice = 10,
                    Quantity = 10
                });
            Console.WriteLine("发送了一个订单");
            client.PlaceOrder(
                new OrderEntry()
                {
                    OrderID = 2,
                    OrderDate = DateTime.Now,
                    UnitPrice = 20,
                    Quantity = 5
                });
            Console.WriteLine("发送了一个订单");
            client.PlaceOrder(
                new OrderEntry()
                {
                    OrderID = 3,
                    OrderDate = DateTime.Now,
                    UnitPrice = 45,
                    Quantity = 3
                });
            Console.WriteLine("发送了一个订单");
            Console.Read();
 
        }
    }
 
 

打开控制面板-服务-消息队列-找到ReportService队列,可看到此时缓存了3条发送的消息。然后运行服务端,此时显示收到了3条订单,并且消息队列中的3条消息消失。

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。