最近看了一些MSMQ的资料,感觉很是奇怪,在IIS中装上此服务后,感觉这东西就像一个小数据库一样,暂时保存一些发送过来的数据,然后另一端再去收取?这样有什么用呢?直接在数据库中建立一个表不就直接解决了吗?还可以实现到底发送给哪一个的用户,可是MSMQ就是一个简单的发送与接收,连用户方向都没有,真不知道他为什么存在?或者说在什么样的解决方案中它可以存在?困惑!困惑!

解决方案 »

  1.   

    petshop4.0里面用到它了,看看可以增加一点感性认识。
    数据库也可以实现消息通讯:同意。
    MSMQ就是一个简单的发送与接收,连用户方向都没有:用户方向是什么意思?
    消费者,生产者?
      

  2.   

    Q:最近看了一些MSMQ的资料,感觉很是奇怪,在IIS中装上此服务后,感觉这东西就像一个小数据库一样,暂时保存一些发送过来的数据,然后另一端再去收取?
    A:是的。Q:这样有什么用呢?直接在数据库中建立一个表不就直接解决了吗?
    A:你可以在数据库中保存一个对象(类的实例)吗?(当然SQL2005是面向对象的了),比如你有一个customer的类的实例,包含有这个customer的名称、年龄等等,你可以直接把这个实例保存到MSMQ,取出后也是实例,由你的问题可以看出对OOP的概念还不熟悉。为什么要用OOP而不是所有的应用都用数据库呢?这个问题你应该好好想想。Q:还可以实现到底发送给哪一个的用户,可是MSMQ就是一个简单的发送与接收,连用户方向都没有,真不知道他为什么存在?
    A:你可以建立若干不同名称,不同权限的MSMQ,并且有入和出两种队列,为何你说没有方向?Q:或者说在什么样的解决方案中它可以存在?
    A:在基于OOP的B/S或C/S结构中都可以采用其作为数据通讯的方式,尤其是需要长时间等待的异步处理。
      

  3.   

    最后一个问题补充下:第一有网络通讯的需求(机器之间的数据交换),第二一定要有Windows系统组成的工作组或域
      

  4.   

    如果数据库中断了连接怎么办?数据没有办法上传了!你可以写到本机的队列中等待通讯恢复后上传服务器。比如银行的业务,底下的分行不需要和总行服务器随时连通的,否则......http://www.microsoft.com/china/windowsserver2003/technologies/msmq/default.mspx
      

  5.   

    首先非常感谢wangsaokui(无间道III(终极无间)C#MVP)精彩详细的解答Q:这样有什么用呢?直接在数据库中建立一个表不就直接解决了吗?
    A:你可以在数据库中保存一个对象(类的实例)吗?(当然SQL2005是面向对象的了),比如你有一个customer的类的实例,包含有这个customer的名称、年龄等等,你可以直接把这个实例保存到MSMQ,取出后也是实例,由你的问题可以看出对OOP的概念还不熟悉。为什么要用OOP而不是所有的应用都用数据库呢?这个问题你应该好好想想Q:还可以实现到底发送给哪一个的用户,可是MSMQ就是一个简单的发送与接收,连用户方向都没有,真不知道他为什么存在?
    A:你可以建立若干不同名称,不同权限的MSMQ,并且有入和出两种队列,为何你说没有方向?OOP这东西我是非常熟悉的,包括一些设计模式,看过资料后也知道它可以发送一个对象,优点序列化和反序列化的意思,关键问题是,如果点对点之间的发送消息,如果用socket我可以指定对方用户的IP,port就可以找到对方,但是MSMQ是要手动创建这么一个消息名称(例如.\Private$\名称),或者用程序去create,但是在B/S中程序只有一个,客户端无数个,或者说session会话N多个,大家都来用这个名称接受发送,器不是乱套了,这就是我所说的用户接收方向(可能我上次表达的不是很清楚)
      

  6.   

    消息通讯大致有两种方式:
    在这里把发送消息的称为producer,接收消息的称为consumer,当然身份不是绝对的。
    1. 点对点,producer和consumer都对某个确定队列进行收发操作,producer发送消息时不需要
    consumer存在,消息只能由一个consumer读取,即读取后消息从队列中删除。
    2. publish-describe,consumer订阅某个主题,当producer针对该主题发送消息后,所有订阅了该主题的consumer都可以收到该消息
    这样不会乱套,可以根据实际情况设计通讯方式。
      

  7.   

    Q:关键问题是,如果点对点之间的发送消息,如果用socket我可以指定对方用户的IP,port就可以找到对方,但是MSMQ是要手动创建这么一个消息名称(例如.\Private$\名称),或者用程序去create,但是在B/S中程序只有一个,客户端无数个,或者说session会话N多个,大家都来用这个名称接受发送,岂不是乱套了,这就是我所说的用户接收方向(可能我上次表达的不是很清楚)
    A: 这个和你的设计有关系,我们不是说所有的程序都需要纪录客户机的ID,你的B/S程序需要纪录客户机的信息吗?你所说的发送和接收是基于物理上的需求,大多数情况和应用有关,比如QQ,MSN,它不管你在哪台机器上发信息,它只纪录当前用户信息,用户收到的信息它可以查询服务器(MSN是这样,QQ有没有做成P2P我没有研究)。再比如一个需要多层审批的办公系统,其中有多个文件等待审批,中间可能还有往复,这种情况我们不需要纪录机器ID,而是纪录这个文件的ID号和状态,不同的消息名称(例如.\Private$\名称)对应不同的状态(比如某某科等待处理文件,某某科正处理文件 etc.,而不是每个用户或计算机建立一个名称),那么查询服务器上的队列就可以知道目前某种状态等待处理的文件有多少。每台客户机的用户只需要根据需求选出队列中的文件进行处理就可以了。当然你从哪台计算机上发出的信息也是可以打包到MSMQ中去的。MSMQ比数据库好就是信息可以保存到本地队列中,连接中断也无所谓,等连上后再从队列中传输到服务器上去。
    感觉你的设计思路还不是太宽。
      

  8.   

    这是个很有用的东西。
    petshop 4.0 中有使用,相信楼主应该使用过亿唐网站查询CET4 6级吧,应为访问的人数太多,所以系统让用户排队。
      

  9.   

    用于通信的基础设施,发送端和接收端可以以各自的节奏来处理消息,无需同步
    发送端发送后可以立即返回,无需等待消息被处理完,队列缓冲了消息
    还有MSMQ可以和IBM MQ互通,这在银行系统很常用自己建表当然也可以部分实现异步的功能,不过相关的管理,和系统账户绑定的安全,性能;不是那么容易自己搞定的
      

  10.   

    研究了一下午,可能对MSMQ的作用渐渐的清晰了,也能还有模糊的地方
    刚开始我对消息的理解就是张三给李四发送了一条消息(类似于QQ、MSN地聊天工具),发送接收时要有路径的(value="FormatName:DIRECT=OS:xwang\Private$\PSOrders"/>),但是后来想到B/S就一个程序(一个路径),那么多的用户,刚开始想的就是任何一个人都能接收到李四的消息了,就觉得乱套了,可能scow(怡红快绿之小橙子|和谐权是第4代人权) 说的有点道理,就是"订阅某个主题"(这个主题就是某个路径吗?)后来下载了PetShop4.0,研究了一下他的异步多线程的MSMQ的处理,一个控制代程序(目前还没看懂这个控制台程序什么时候自动执行,什么时候把数据保存到数据库?),我的理解就是用来把订单数据(orderinfo)用来缓存在MSMQ里面的,然后再保存到数据库,这里缓存的是一个类对象,所以它无需张三李四,这样看的话,就推翻掉了我刚开始的认为(张三给李四发送了一条消息)在后来,我又想到了以前做过一点biztalk,当时也看到了消息队列的方式,当时不懂,没有理会他,只选用了XML的文件方式,那我可不可以理解MSMQ是一个中间的缓存地方,最后实现数据交换,而绝非“张三给李四发送了一条消息”
      

  11.   

    哦,sorry,sorry,刚刚一个小问题搞错了,我知道控制台程序什么时候该运行了,其实就是一个window服务,好像domino一样,一直打开它就可以了,呵呵~~~我们撇开这个问题,继续讨论MSMQ,我这个人喜欢研究新的技术,虽然这个东西不在我们的项目里面应用
      

  12.   

    MSMQ还是相当有用的。我们这里的软件要保持更改的一致性,当一台机器对列表什么的进行修改了之后,在其他的机器上需要立即显示出有地方修改了,提示用户更新当前机器打开的列表。这些都是用MSMQ来实现的。不过MSMQ的安装有时候会比较麻烦。呵呵。
      

  13.   

    可惜微软没有自动安装好基本MSMQ,用的时候需要手动安装遗憾,所以本来想用这个技术,而没有用
      

  14.   

    问个问题:如果对象已经在MSMQ队列中,这个时候服务器断电了, 重新启动后, 这个对象依然存在吗?
      

  15.   

    存在的,我的电脑上的msmq传出队列里有几个因为路径的问题一直没有发送的信息,开关机好几次还是存在的