设为首页 收藏本站
查看: 1053|回复: 0

[经验分享] 利用Service bus中的queue中转消息

[复制链接]

尚未签到

发表于 2017-7-1 09:39:29 | 显示全部楼层 |阅读模式
  有需求就有对策就有市场。
  由于公司global的policy,导致对公司外发邮件的service必须要绑定到固定的ip地址,所以别的程序需要调用发邮件程序时,问题就来了,如何在azure上跨service进行work role的调用呢?(work role和web role是两个不同的东西,主要区别在work role是每个单独的不依附与web application,web role则不是)
  微软的解决方案有几:
  1,  目前发送Email的Cloud Service的workrole同时实现接收发送email的请求,可以有多种接收请求的模式:
  a)         通过Azure Service Bus Queue实现,需要发送email的应用将发生的信息打包发送到指定的Azure Service Bus Queue,workrole会侦听该queue,有信息到时接收信息,并触发email发送功能
  b)        通过TCP或HTTP协议对外提供侦听服务,该协议的侦听端口通过Cloud Service的endpoint对外开放,需要发送email的应用通过这些服务端口向该workrole发送信息,通知workrole发送email
  c)   (不推荐,需前期部署时就进行分配)watch out net
  此次贪图方便,选了方案一:利用queue进行监听,并触发Email发送功能
  Azure Service Bus Queue是一个云端的消息队列PAAS服务,可以参考以下的文档来创建和开发Service Bus Queue的功能:
  1,  管理和初步Queue代码:https://www.azure.cn/documentation/articles/service-bus-dotnet-how-to-use-queues/
  2,  Service Bus开发指南:https://www.azure.cn/documentation/articles/service-bus-create-queues/
  3,  样例代码:https://www.azure.cn/documentation/articles/service-bus-samples/
  首先在请求的project中web.config配置:


DSC0000.gif DSC0001.gif


  <appSettings>
     <add key="Microsoft.ServiceBus.ConnectionString" value="Endpoint=sb://xxx.servicebus.chinacloudapi.cn;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xxx" />
   </appSettings>
webconfig  发送请求的代码:



string connectionString = ConfigurationManager.AppSettings["Microsoft.ServiceBus.ConnectionString"];

             var namespaceManager =
                 NamespaceManager.CreateFromConnectionString(connectionString);
             if (!namespaceManager.QueueExists("EmailQueue"))
             {
                 namespaceManager.CreateQueue("EmailQueue");
             }
             //queue.AddMessageAsync(new CloudQueueMessage(message));
             QueueClient Client =
     QueueClient.CreateFromConnectionString(connectionString, "EmailQueue");

             // Create message, passing a string message for the body.
             BrokeredMessage message = new BrokeredMessage("Email Message");

             // Set some addtional custom app-specific properties.
             message.Properties["sender"] = sender;
             message.Properties["subject"] = mailSubject;
             message.Properties["address"] = mailAddress;
             message.Properties["body"] = mailBody;

             try
             {
                 // Send message to the queue.
                 Client.Send(message);
             }
             catch (Exception ex)
             {
                 throw ex;
             }
  接收service的app.config配置:





<appSettings>
     <!-- Service Bus specific app setings for messaging connections -->
     <add key="Microsoft.ServiceBus.ConnectionString" value="Endpoint=sb://xxx.servicebus.chinacloudapi.cn;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xxx" />
   </appSettings>
appconfig  接收的程序代码:



private void RunServiceBus()
         {
             string connectionString =
    CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");
             Microsoft.ServiceBus.Messaging.QueueClient Client =
               Microsoft.ServiceBus.Messaging.QueueClient.CreateFromConnectionString(connectionString, "EmailQueue");

             // Configure the callback options.
             OnMessageOptions options = new OnMessageOptions();
             options.AutoComplete = false;
             options.AutoRenewTimeout = TimeSpan.FromMinutes(1);

             string sender = string.Empty;
             string mailSubject = string.Empty;
             string mailAddress = string.Empty;
             string mailBody = string.Empty;

             // Callback to handle received messages.
             Client.OnMessage((message) =>
             {
                 try
                 {
                     // Process message from queue.                  
                     sender = message.Properties["sender"].ToString();
                     mailSubject = message.Properties["subject"].ToString();
                     mailAddress = message.Properties["address"].ToString();
                     mailBody = message.Properties["body"].ToString();
                     SendEmail(sender, mailSubject, mailAddress, mailBody);

                     // Remove message from queue.
                     message.Complete();
                 }
                 catch (Exception)
                 {
                     // Indicates a problem, unlock message in queue.
                     message.Abandon();
                 }
             }, options);

         }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-389930-1-1.html 上篇帖子: 20本经典云计算书籍和内容简介(转载) 下篇帖子: 使用ARM和VMSS创建自动扩展的web集群
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表