用MsmqBinding投送message出现的一个灵异事件 【第二篇】

  一直都在用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             else
17             {
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             else
17             {
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<IHomeService> factory = new ChannelFactory<IHomeService>(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<IHomeService> factory = new ChannelFactory<IHomeService>(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方法,只是微软给我们封装了而已。

时间: 2024-08-05 12:22:33

用MsmqBinding投送message出现的一个灵异事件 【第二篇】的相关文章

missing message for key 灵异事件

Key words: IE的默认语言若不为简体中文,则会导致此问题发生 刚在某内网服务器(英文 Win2003Server Standard 64Bit)搭建了一套应用(WebLogic11G+Oracle11G),结果我本地访问时报“missing message for key”,第一反应是语言资源文件没放上去,但当时让同事A也访问一下,结果一切正常,再找另一个同事B,还是一切正常,结果我就被BS为人品差……上网查了半天就是说资源文件有问题,少报错的那一项.经查,资源文件肯定是没有任何问题的

SWUST OJ 东6宿舍灵异事件(0322)

东6宿舍灵异事件(0322) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 88 Accepted: 31 Description 将军听说最近东6闹鬼了,作为一个无神论者,将军当然不相信.但是这个传言已经泛滥了,许多人都在说这个事情,将军从每个人那里听到一个传言,将军可以容易的就知道这个传言是真还是假,但是当一大堆消息组合起来,将军就不知道了,所以将军就找到了你. 提供两种组合方式: A&B:代表A和B都为真的时候,A和B组合

android中listview点击事件失效的灵异事件

首先说明一下我想实现的功能: 点击某个item之后,让其颜色发生变化.如果变化网上有很多例子,我就不班门弄斧了.Listview之所以点击没有反应是因为上图中绿色部分(自己定义的一个继承BaseAdapter的adapter来适应listview)将listview的item覆盖了.现在点击的只是自定义的adapter中的convertView. 其次,自定义的adapter中包含一个ImageView和二个TextView.代码如下: <?xml version="1.0" e

灵异事件之:Android Studio 3.4提示:Error running app: Default Activity Not Found

本次事件尚未解决,如果有手法独特的大神,请在评论区开车. 问题症状:之前在AS上能好好运行的项目,楼主一不小心,把AS的版本更新到3.4之后,所有项目都是能通过编译,但是运行处依然提示红叉.Event log显示:Error running 'app': Default Activity not found. 网上大部分解决方法: AndroidManifest.xml里的activity name包名没有完善 原本是默认为android:name=".MainActivity" 网友

MySQL 灵异事件一则 -- desc报语法错误

今天有一开发同学找到我,说查询SQL中倒序报错,不明原因,于是奔赴工位现场研究情况. 果然,只要SQL中带有desc 就会报错,而ASC没问题. 哪怕desc放在句首用作explain也会报错. 报错信息为语法错误... 检查了sql-mode发现是空,看来不是这个原因,那问题出在哪呢? 测试库的环境是保存在windows个人电脑中的,开发MM说,以前没遇到过这个情况,但是最近为了图省事,在windows的msconfig中配置了MySQL开机启动,然后就这样了. 于是shutdown数据库,手

写代码遇到的灵异事件

1. 问题表现 消息 102,级别 15,状态 1,过程 wx_kaliushui,第 8 行'GO' 附近有语法错误. 为了说明问题,我把代码精简到极致,如下: 2. 排查过程 2.1. 去掉注释部分,问题解决 2.2. 去掉GO,问题解决 2.3. 注释掉GO,问题解决 2.4. 将代码全选复制到qq聊天记录,然后再全选复制回MSSMS,问题解决 2.5. 将代码复制到虚拟机的MSSMS,问题解决 且慢!GO前面的回车符号哪里去了? 2.6. 将代码保存成文件,然后用记事本打开 且慢+1 !

[Swust OJ 322]--东6宿舍灵异事件(中缀表达式转化为后缀表达式的简单运用)

题目链接:http://acm.swust.edu.cn/problem/322/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 将军听说最近东6闹鬼了,作为一个无神论者,将军当然不相信.但是这个传言已经泛滥了,许多人都在说这个事情,将军从每个人那里听到一个传言,将军可以容易的就知道这个传言是真还是假,但是当一大堆消息组合起来,将军就不知道了,所以将军就找到了你. 提供两种组合方式: A&B:代表A和B都为真的时候,A和B组合起

记一次2000端口灵异事件

前段时间配合开发在测试环境和生存环境搭建一套tomcat中间件应用,启动了2000和2001端口,在测试环境验证都是正常,但是在生产环境中发现2000端口的前端请求一直在转圈没有返回. 具体访问链路请求如下: 办公网  ==>  域名(pms.panet.com.cn 绑定f5 vip)==> SF区域机器(10.47.115.12)==> 其他系统模块 具体现象如下: pms.panet.com.cn:2001/proxy/index.html 2001端口可以访问,tomcat有日志

redis系列-14点的灵异事件

概述 项目组每天14点都会遭遇惊魂时刻.一条条告警短信把工程师从午后小憩中拉回现实.之后问题又神秘消失.是PM喊你上工了?还是服务器给你开玩笑?下面请看工程师如何一步一步揪出真凶,解决问题. 如果不想看故事,可以直接跳到最后事后烟章节下看和Redis相关部分. 起因 某天下午,后端组的监控系统发出告警,服务器响应时间变长,超过了阈值.过一会儿系统自动恢复了,告警解除. 第二天差不多的时间点,监控系统又发出了同样的告警,过几分钟后又恢复了. 我们决定排查这个问题. 背景 首先要介绍一下应用的架构,