消息队列初体验

本文详细介绍了使用C#操作MSMQ(微软的消息队列)进行消息队列的创建、发送、接收及删除的操作流程,并通过示例展示了如何使用IBM WebSphere MQ实现本地队列的创建、消息的发送与接收。文章涵盖了路径语法、消息格式化、事务处理及队列管理等关键知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、MSMQ(微软的消息队列)

using System;
using System.Collections.Generic;
using System.Text;消息队列初体验 - 吴桂林 - 分享快乐
 
using System.Messaging;
using System.Transactions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MessageQueue mq = new MessageQueue();
            //判断队列是否存在
            if (MessageQueue.Exists(@".\Private$\test"))
                MessageQueue.Delete(@".\Private$\test");    //删除队列
            MessageQueue.Create(@".\Private$\test");        //创建队列
            mq.Path = @".\Private$\test";

            #region 路径中使用的语法 
            //公共队列 
            //MachineName\QueueName 
            //专用队列 
            //MachineName\Private$\QueueName 
            //日志队列 
            //MachineName\QueueName\Journal$ 
            //示例:
            //  mq.Path = @"sf00902395d34\Private$\test";  //sf00902395d34是主机名
            //  mq.Path = @"FormatName:DIRECT=OS:sf00902395d34\Private$\test";
            //  mq.Path = @"FormatName:DIRECT=OS:localhost\Private$\test";
            //  访问远程电脑上的消息队列时Path的格式
            //  mq.Path = @"FormatName:DIRECT=OS:server\Private$\test";
            #endregion

            //构造消息
            Message msg = new Message();
            msg.Body = "HelloWorld:" + DateTime.Now.ToString();
            msg.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });     //消息格式化

            //向队列发送消息
            mq.Send(msg, "001");
            mq.Send(msg, "002");
            mq.Send(msg, "003");
            mq.Send(msg, "004");

            //读取队列中的所有消息
            Message[] msgs = mq.GetAllMessages();
            foreach (Message m in msgs)
            {
                using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
                {
                    try
                    {
                        Message mRec = mq.Receive();         //接受消息
                        //Message mRec = mq.ReceiveById("1");         //接受消息
                        //Message mRec = mq.Peek();             //查看
                        //Message mRec = mq.PeekById("002");             //查看
                        mRec.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
                        Console.WriteLine(mRec.Body);
                        ts.Complete();
                    }
                    catch
                    {

                    }
                }
            }

            //清除队列中的所有消息
            //mq.Purge();
            Console.Read();
        }
    }
}
问题解决:
一、此计算机上尚未安装消息队列
    控制面板里,选择添加删除,添加删除windows组件,选择服务里的Msmq(Microsoft   Message   Queue)

二、队列不存在,或您没有足够的权限执行该操作。
    打开Computer Management – Message Queuing,在Private Queues下创建MSMQDemo队列 
    也可以用代码解决
    if (!MessageQueue.Exists(".""Private$""MSMQDemo"))
    {
          MessageQueue.Create(".""Private$""MSMQDemo");
    }

二、IBM WebSphere MQ
           //新建本地队列            
            PCFMessageAgent agent = new PCFMessageAgent("QM_janus");         //QM_janus队列管理器名称
            PCFMessage request = new PCFMessage(CMQCFC.MQCMD_CREATE_Q);           
            request.AddParameter(MQC.MQCA_Q_NAME, "test_queue");                //test_queue队列名称
            request.AddParameter(MQC.MQIA_Q_TYPE, MQC.MQQT_LOCAL);
            //request.AddParameter(MQC.MQIA_USAGE, MQC.MQUS_TRANSMISSION);
            PCFMessage[] response = agent.Send(request);

            //删除队列
            PCFMessageAgent agent = new PCFMessageAgent("QM_janus");
            PCFMessage request = new PCFMessage(CMQCFC.MQCMD_DELETE_Q);
            request.AddParameter(MQC.MQCA_Q_NAME, "test_queue");
            PCFMessage[] response = agent.Send(request);

            //向队列写消息
            MQQueueManager qMgr = new MQQueueManager("test");
            MQQueue queue = qMgr.AccessQueue("test_queue", MQC.MQOO_OUTPUT);
            MQMessage message = new MQMessage();
            message.WriteString("message body");
            queue.Put(message);

            //向队列读消息
            MQQueueManager qMgr = new MQQueueManager("test");
            MQQueue queue = qMgr.AccessQueue("test_queue", MQC.MQOO_INPUT_AS_Q_DEF);
            MQMessage message = new MQMessage();
            MQGetMessageOptions gmo = new MQGetMessageOptions();
            gmo.Options = MQC.MQGMO_WAIT;
            gmo.WaitInterval = 1000;
            gmo.MatchOptions = MQC.MQMO_NONE;
            queue.Get(message);
            MessageBox.Show(message.ReadString(100));

            //向队列写消息
            MQQueueManager qMgr = new MQQueueManager("QM_janus");
            MQQueue queue = qMgr.AccessQueue("postcard", MQC.MQOO_OUTPUT);
            MQMessage message = new MQMessage();
            message.WriteString("message body");
            queue.Put(message);

            //枚举所有队列
            PCFMessageAgent agent = new PCFMessageAgent("QM_janus");
            PCFMessage request = new PCFMessage(CMQCFC.MQCMD_INQUIRE_Q_NAMES);
            request.AddParameter(MQC.MQCA_Q_NAME, "*");
            PCFMessage[] response = agent.Send(request);
            string[] names = response[0].GetStringListParameterValue(CMQCFC.MQCACF_Q_NAMES);
### 黑马点评项目中的 Stream 消息队列实现 #### 1. **Stream 消息队列简介** Stream 消息队列是一种基于事件驱动的消息传递机制,通常用于分布式系统中解耦组件之间的通信。它允许生产者发送消息到特定的主题(Topic),消费者订阅这些主题并处理消息[^3]。 在黑马点评项目的上下文中,Stream 消息队列可能被用来实现实时通知、订单状态更新、评论审核等功能。这种架构能够显著提高系统的可扩展性和性能。 --- #### 2. **架构设计** ##### (1)**生产者-消费者模型** 在黑马点评项目中,Stream 消息队列采用经典的生产者-消费者模式。以下是其基本工作流程: - 生产者负责将数据(如新评论、用户行为日志等)发布到指定的 Topic 中。 - 消费者订阅该 Topic 并接收消息进行后续处理,比如触发缓存刷新、生成统计数据或发送邮件/短信提醒。 此模式通过异步方式减少服务间的依赖关系,从而提升整体稳定性[^4]。 ```java // Java 示例:Kafka Producer 发送消息至 Stream 队列 Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); Producer<String, String> producer = new KafkaProducer<>(props); producer.send(new ProducerRecord<>("topic_name", "key", "message")); producer.close(); ``` --- ##### (2)**微服务集成** 由于黑马点评是一个复杂的微服务体系,各模块之间需要高效协作。借助 Stream 消息队列,可以轻松完成跨服务的数据共享与同步操作。例如,在新增一条评价记录后,可以通过消息通知其他相关服务执行相应逻辑。 具体而言,假设存在三个主要的服务单元——`CommentService`, `CacheService` 和 `NotificationService` ——它们分别承担存储评论信息、维护内存级高速访问以及推送即时反馈的任务,则整个交互过程如下所示: 1. 用户提交了一条评论; 2. Comment Service 将这条数据持久化入库的同时向 Message Queue 投递一份副本; 3. Cache Service 接收到广播信号之后立即加载最新版本的内容以便前端快速展示给浏览者查看; 4. Notification Service 则依据预设规则筛选目标群体并通过电子邮件或者手机短讯告知他们有关动态变化情况的通知详情。 上述场景充分体现了利用流式传输技术所带来的灵活性优势所在之处[^5]。 --- #### 3. **实施教程要点** 为了成功部署并运行基于 Stream 的消息队列解决方案,开发者应当遵循以下几个关键步骤: - **环境搭建**: 安装配置好所需的中间件软件包 (e.g., Apache Kafka / RabbitMQ),确保网络连通状况良好无误。 ```bash sudo apt-get install kafka ``` - **编码实践**: 参考官方文档编写适配各自业务需求的应用程序接口(APIs)代码片段;注意异常捕获机制的设计以增强健壮程度。 ```python from kafka import KafkaConsumer consumer = KafkaConsumer('my_topic', group_id='my_group', bootstrap_servers=['localhost:9092']) for message in consumer: print(f"{message.topic}:{message.partition} -> {message.value.decode()}") ``` - **监控运维**: 建立健全的日志审计体系帮助定位潜在隐患问题所在位置及时修复改进措施落实到位。 --- ### 结论 综上所述,通过引入像 CORBA 这样的通用对象请求代理结构 [^1], 或者现代轻量级框架 Vue.js 来辅助开发图形界面部分 [^2], 加强后台支撑能力显得尤为重要。而选用恰当类型的 Streams Messaging System 不仅有助于简化复杂度较高的多线程并发控制难题解决途径探索研究方向提供理论指导意义非凡之外还能有效促进资源利用率最大化水平达到预期效果最佳表现形式呈现出来供广大使用者体验享受便利快捷优质服务产品带来的乐趣无穷魅力无限美好未来前景展望充满希望曙光初现黎明前夜即将迎来辉煌灿烂明天!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值