博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用MsmqBinding投送message出现的一个灵异事件 【第二篇】
阅读量:7078 次
发布时间:2019-06-28

本文共 4162 字,大约阅读时间需要 13 分钟。

 

  一直都在用Msmqbinding,也一直忽视了message里面的内容格式是什么样的,这也是微软给我们高层封装带给我们的开发效率,但同时一旦中间出了什么问题,

就不知道从何查起了。有个需求是这样的,服务端和客户端采用离线连接,也就是消息队列模式,server接收端在处理消息的时候,要根据一定的逻辑,如果该消息不

满足规则,就把消息原样的丢回消息队列中,问题就出现在这里。。。消息丢进去了,然后,然后就tmd的飞走了!!!先快速的看下代码。

 

一:示例代码

1.server端

1         public void Run(Test test) 2         { 3             if (test.str.Length % 10 == 0) 4             { 5                 //重新丢回消息队列 6                 MessageQueue mq = new MessageQueue(@".\private$\myqueue"); 7                 Message msg = new Message(); 8                 msg.Body = test; 9                 msg.Formatter = new XmlMessageFormatter(new Type[] { test.GetType() });10 11                 mq.Send(msg);12                 //Environment.Exit(0);13 14                 System.Console.WriteLine("已经成功丢回! ,当前线程:" + Thread.CurrentThread.ManagedThreadId);15             }16             else17             {18                 System.Console.WriteLine("已经消费客户端消息!");19             }20         }

2.服务代码

1         public void Run(Test test) 2         { 3             if (test.str.Length % 10 == 0) 4             { 5                 //重新丢回消息队列 6                 MessageQueue mq = new MessageQueue(@".\private$\myqueue"); 7                 Message msg = new Message(); 8                 msg.Body = test; 9                 msg.Formatter = new XmlMessageFormatter(new Type[] { test.GetType() });10 11                 mq.Send(msg);12                 //Environment.Exit(0);13 14                 System.Console.WriteLine("已经成功丢回! ,当前线程:" + Thread.CurrentThread.ManagedThreadId);15             }16             else17             {18                 System.Console.WriteLine("已经消费客户端消息!");19             }20         }

3.client端

1         static void Main(string[] args) 2         { 3             var msmq = new NetMsmqBinding(NetMsmqSecurityMode.None); 4  5             msmq.ExactlyOnce = false; 6  7             ChannelFactory
factory = new ChannelFactory
(msmq, 8 "net.msmq://localhost/private/myqueue"); 9 10 var client = factory.CreateChannel();11 12 for (int i = 0; i < int.MaxValue; i++)13 {14 var t = new Test() { str = "1111111111" };15 16 client.Run(t);17 Console.WriteLine("调用第 " + i + " 次");18 }19 20 var s = 10;21 }

当时写的急,也没关注能不能用MessageQueue将消息丢回消息队列中,然后让WCF的MsmqBinding去读取,结果上面的奇葩问题就来了,反正队列中的数据

一直在减少,但是server端就是没进来,tmd的wcf却一个错误都不抛出来,麻蛋。。。为了展示出效果,我特意做成了flash。

从上面的flash中,你可以看到console控制台已经不在接受消息了,但是奇怪的是消息队列中的数据还是一直在减少。。。。

 

二:怀疑

  从开始在server端将message丢回消息队列的时候,我就有一点怀疑,或许这两种message的内容格式不一样,wcf在接受的时候应该会报错,但是tmd的

就是没有给小爷报错,现在既然问题来了,我就去比较一下,到底两种message的格式是什么样的,然后我就写了两份丢消息队列的方法。

1         static void Main(string[] args) 2         { 3             //第一种方式: 4             var msmq = new NetMsmqBinding(NetMsmqSecurityMode.None); 5             msmq.ExactlyOnce = false; 6  7             ChannelFactory
factory = new ChannelFactory
(msmq, 8 "net.msmq://localhost/private/myqueue"); 9 var client = factory.CreateChannel();10 11 var t = new Test() { str = "1111111111" };12 13 client.Run(t);14 15 16 //第二种方式:17 MessageQueue mq = new MessageQueue(@".\private$\myqueue");18 Message msg = new Message();19 msg.Body = t;20 msg.Formatter = new XmlMessageFormatter(new Type[] { t.GetType() });21 22 mq.Send(msg);23 }

 

然后我跑去MMC控制台看一下,果然消息的大小都不一样,内容也不一样。。。真相大白,左边也不知道是什么格式,右边很清楚的看到是xml格式。

 

 

如果文章到这里的话,说明我也就只能看表面现象,因为刚才我已经提出了一个问题,左边到底是什么格式???

 

三:进一步探索

  现在我们知道Msmqbinding使用的是自己独有格式的消息body,现在是不是有耐心看看wcf这个底层怎么写的呢???我通过一系列的调试跟踪,

发现MsmqBinding是先创建一个Msmq的信道栈,可以看到这个channel要传递的消息是soap12协议的,不管是什么样的,可以确认的是,消息传递

采用的soap消息的模式。对吧,如下图:

 

接下来,这个channel会调用wcf自己封装的消息队列MsmqQueue,并且会调用其中的send方法,将消息推送到消息队列中,不过要记住,wcf中那

些高层的msmq操作,在底层都是这个类来达到效果的。

 

好了,探索就到这里为止了,到现在我们起码知道以下二点消息了。

 

第一: MessageQueue类投送的消息一般可以指定xml或者binaray,而WCF中的Msmq中的消息采用的是soap格式。。。这也是为什么一个内容小,一个大。

第二: WCF中所有的高层消息操作,都是建立在自己独有个MsmqQueue之上,包括send,received方法,只是微软给我们封装了而已。

 

转载地址:http://xipml.baihongyu.com/

你可能感兴趣的文章
angularjs my97 datepicker directive demo
查看>>
虐心,Hello World
查看>>
[雪峰磁针石博客]python库介绍-collections:高性能容器数据类型
查看>>
USB4 规范发布,双倍带宽,达到 40 Gbps
查看>>
开源中国 2018 年度榜单之国产新秀榜
查看>>
Microsoft Edge同源策略不严导致任意文件读取测试
查看>>
升级phpstudy2018默认mysql版本到5.7
查看>>
一位android开发程序猿的小工具集合
查看>>
Mybatis 动态 SQL 详解
查看>>
1024. Palindromic Number (25)
查看>>
【译Py】数据科学面试终极指南04
查看>>
PyCodeInjectionShell - 自动Python代码注入工具
查看>>
sharding-jdbc不分库策略在springboot的application.properties中的写法
查看>>
SEO权重的优化1
查看>>
Linux基本bash命令(持续更新)
查看>>
[JavaScript 学习笔记] 2. 继承
查看>>
使用gdebi去解决安装deb包的时候软件依赖问题
查看>>
SOP 1.6.0 发布,开放平台解决方案项目
查看>>
Java并发编程笔记之AbstractQueuedSynchronizer源码分析
查看>>
AI戒毒?没错,北京开始这么干了
查看>>