Azure学习笔记:Service Bus(2)



Service Bus在Azure的产品线上应该是款重量级的产品,它不但具备MSSQ的消息队列功能,而且还具备消息转发功能,即作为一个中介者将系统的请求/相应转发给需要的系统,以此将不同的系统进行解耦。

1. MSMQ功能

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Messaging;
using System.Threading;

namespace ConsoleApplication2
{
    class Program
    {
        private static string QueueName = "jeffqueue";
        private static QueueClient queueClient;
        static void Main(string[] args)
        {
            Console.WriteLine("Create Queue");
            CreateQueue();
            Console.ReadKey();
            Console.WriteLine("Send Message");
            SendMessage();
            Console.ReadKey();
            Console.WriteLine("Receive Message");
            ReceiveMessage();
            Console.ReadKey();
        }

        static void CreateQueue()
        {
            NamespaceManager nm = NamespaceManager.Create();
            if (nm.QueueExists(QueueName))
            {
                nm.DeleteQueue(QueueName);
            }
            nm.CreateQueue(QueueName);
            Console.WriteLine("Create Queue successful!");

        }

        static void SendMessage()
        {
            BrokeredMessage m1 = new BrokeredMessage("hello queue 1!");
            m1.MessageId = "1";
            BrokeredMessage m2 = new BrokeredMessage("hello queue 2!");
            m2.MessageId = "2";
            BrokeredMessage m3 = new BrokeredMessage("hello queue 3!");
            m3.MessageId = "3";
            BrokeredMessage m4 = new BrokeredMessage("hello queue 4!");
            m4.MessageId = "4";
            BrokeredMessage m5 = new BrokeredMessage("hello queue 5!");
            m5.MessageId = "5";

            queueClient = QueueClient.Create(QueueName);
            List<BrokeredMessage> msgList = new List<BrokeredMessage>();
            msgList.Add(m1);
            msgList.Add(m2);
            msgList.Add(m3);
            msgList.Add(m4);
            msgList.Add(m5);

            foreach (var item in msgList)
            {
                try { 
                    queueClient.Send(item);
                 }
                catch(MessagingException ex)
                {
                    if (ex.IsTransient)
                    {
                        Console.WriteLine(ex.Message);
                        Console.WriteLine("please wait 2 second");
                        Thread.Sleep(2000);
                    }
                    else
                    {
                        throw;
                    }
                    
                }
                Console.WriteLine("message {0} was sent successfully", item.MessageId);
            }



        }

        static void ReceiveMessage()
        {
            BrokeredMessage m = null;
            while (true)
            {
                try
                {
                    m = queueClient.Receive(TimeSpan.FromSeconds(5));
                    if (m != null)
                    {
                        Console.WriteLine("message id={0}, content={1}", m.MessageId, m.GetBody<string>());
                        m.Complete();
                    }
                    else
                    {
                        break;
                    }
                }
                catch
                {
                
                }

            }
        }
    }
}

2. 消息中介功能

     消息中介的功能主要体现在配置上,我们需要配置需要开发的服务,例如WCF。将它连上Azure的Service Bus,这样客户端就可以通过访问Service Bus来完成相应的业务处理。

服务端

<system.serviceModel>
    <services>

        <service name="AzueRelayServer.ProblemSolver">
          <endpoint contract="AzueRelayServer.IProblemSolver"
                    binding="netTcpBinding"
                    address="net.tcp://localhost:9358/solver"/>
          <endpoint contract="AzueRelayServer.IProblemSolver"
                    binding="netTcpRelayBinding"
                    address="sb://ghservicebus01.servicebus.windows.net/solver"
                    behaviorConfiguration="sbTokenProvider"/>
        </service>

      </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="sbTokenProvider">
          <transportClientEndpointBehavior>
            <tokenProvider>
              <sharedSecret issuerName="owner" issuerSecret="XiGqjsJiRT1CWM63RqEAEaR/I9gCxm1IHZXq4hYMVPI=" />
            </tokenProvider>
          </transportClientEndpointBehavior>
        </behavior>
      </endpointBehaviors>

      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, 
          set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" />
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  <extensions>
      <!-- In this extension section we are introducing all known service bus extensions. User can remove the ones they don't need. -->
      <behaviorExtensions>
        <add name="connectionStatusBehavior" type="Microsoft.ServiceBus.Configuration.ConnectionStatusElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="transportClientEndpointBehavior" type="Microsoft.ServiceBus.Configuration.TransportClientEndpointBehaviorElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="serviceRegistrySettings" type="Microsoft.ServiceBus.Configuration.ServiceRegistrySettingsElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </behaviorExtensions>
      <bindingElementExtensions>
        <add name="netMessagingTransport" type="Microsoft.ServiceBus.Messaging.Configuration.NetMessagingTransportExtensionElement, Microsoft.ServiceBus,  Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="tcpRelayTransport" type="Microsoft.ServiceBus.Configuration.TcpRelayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="httpRelayTransport" type="Microsoft.ServiceBus.Configuration.HttpRelayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="httpsRelayTransport" type="Microsoft.ServiceBus.Configuration.HttpsRelayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="onewayRelayTransport" type="Microsoft.ServiceBus.Configuration.RelayedOnewayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </bindingElementExtensions>
      <bindingExtensions>
        <add name="basicHttpRelayBinding" type="Microsoft.ServiceBus.Configuration.BasicHttpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="webHttpRelayBinding" type="Microsoft.ServiceBus.Configuration.WebHttpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="ws2007HttpRelayBinding" type="Microsoft.ServiceBus.Configuration.WS2007HttpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="netTcpRelayBinding" type="Microsoft.ServiceBus.Configuration.NetTcpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="netOnewayRelayBinding" type="Microsoft.ServiceBus.Configuration.NetOnewayRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="netEventRelayBinding" type="Microsoft.ServiceBus.Configuration.NetEventRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="netMessagingBinding" type="Microsoft.ServiceBus.Messaging.Configuration.NetMessagingBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </bindingExtensions>
    </extensions></system.serviceModel>


客户端

<system.serviceModel>
  <client>
    <endpoint name="solver" contract="AzueRelayServer.IProblemSolver"
              binding="netTcpRelayBinding"
              address="sb://ghservicebus01.servicebus.windows.net/solver"
              behaviorConfiguration="sbTokenProvider"/>
  </client>
  <behaviors>
    <endpointBehaviors>
      <behavior name="sbTokenProvider">
        <transportClientEndpointBehavior>
          <tokenProvider>
            <sharedSecret issuerName="owner" issuerSecret="XiGqjsJiRT1CWM63RqEAEaR/I9gCxm1IHZXq4hYMVPI=" />
          </tokenProvider>
        </transportClientEndpointBehavior>
      </behavior>
    </endpointBehaviors>
  </behaviors>

  <extensions>
      <!-- In this extension section we are introducing all known service bus extensions. User can remove the ones they don't need. -->
      <behaviorExtensions>
        <add name="connectionStatusBehavior" type="Microsoft.ServiceBus.Configuration.ConnectionStatusElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="transportClientEndpointBehavior" type="Microsoft.ServiceBus.Configuration.TransportClientEndpointBehaviorElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="serviceRegistrySettings" type="Microsoft.ServiceBus.Configuration.ServiceRegistrySettingsElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </behaviorExtensions>
      <bindingElementExtensions>
        <add name="netMessagingTransport" type="Microsoft.ServiceBus.Messaging.Configuration.NetMessagingTransportExtensionElement, Microsoft.ServiceBus,  Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="tcpRelayTransport" type="Microsoft.ServiceBus.Configuration.TcpRelayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="httpRelayTransport" type="Microsoft.ServiceBus.Configuration.HttpRelayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="httpsRelayTransport" type="Microsoft.ServiceBus.Configuration.HttpsRelayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="onewayRelayTransport" type="Microsoft.ServiceBus.Configuration.RelayedOnewayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </bindingElementExtensions>
      <bindingExtensions>
        <add name="basicHttpRelayBinding" type="Microsoft.ServiceBus.Configuration.BasicHttpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="webHttpRelayBinding" type="Microsoft.ServiceBus.Configuration.WebHttpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="ws2007HttpRelayBinding" type="Microsoft.ServiceBus.Configuration.WS2007HttpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="netTcpRelayBinding" type="Microsoft.ServiceBus.Configuration.NetTcpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="netOnewayRelayBinding" type="Microsoft.ServiceBus.Configuration.NetOnewayRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="netEventRelayBinding" type="Microsoft.ServiceBus.Configuration.NetEventRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add name="netMessagingBinding" type="Microsoft.ServiceBus.Messaging.Configuration.NetMessagingBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </bindingExtensions>
    </extensions>
  </system.serviceModel>


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值