C#操作RocketMQ用NewLife.RocketMQ发布消息,消费消息

发布消息

using NewLife.Log;
using NewLife.Messaging;
using NewLife.RocketMQ;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp1_RocketMq
{
    class Program
    {
        

        //押金订单
        static string json2 =
"			{					" +
"			OrderNo:\"DFGDFGIAL456827689\"," +
"			OrderTime:\"2020-08-31 02:55:35\"," +
"          ShopNo:\"DSLFJHLJFIEINCXLKFG\",       " +
"          ShopName:\"五大花园店泡脚牛肉米线\",           " +
"			ReceivingArea:\"北京(BJ)北京(010)\"," +
"			Address:\"北京市海淀区知春路65号中国卫星通信大厦B座23层\"," +
"			Revicer:\"李世民\"," +
"			Phone:\"18756542695\"," +
"			Total:\"\"," +
"          ShipFee:\"3.50\",     " +
"   TotalDeposit:\"200.00\",     " +
"   DailyRent:\"50\",     " +
"			PointsDiscount:\"\"," +
"			RealPay:\"\"," +
"          Remark:\"9-1-01测试订单,不需要加肉\",  " +
"			DataItems:[" +
"			\"肥牛 x2¥59.00\"," +
"			\"大白菜 x1¥59.00\",         " +
"			\"白萝卜 x3¥59.00\",         " +
"			\"千层肚 x5¥59.00\",         " +
"			\"黄喉 x6¥59.00\",               " +
"			\"菌花 x6¥59.00\",               " +
"			\"腰片 x6¥59.00\",               " +
"			\"虾滑 x6¥59.00\",               " +
"			\"肥牛 x2¥59.00\",               " +
"			\"大白菜 x1¥59.00\",         " +
"			\"白萝卜 x3¥59.00\",         " +
"			\"千层肚 x5¥59.00\",         " +
"			\"黄喉 x6¥59.00\",               " +
"			\"菌花 x6¥59.00\",               " +
"			\"腰片 x6¥59.00\",               " +
"			\"虾滑 x6¥59.00\",               " +
"			\"肥牛 x2¥59.00\",               " +
"			\"大白菜 x1¥59.00\",         " +
"			\"白萝卜 x3¥59.00\",         " +
"			\"千层肚 x5¥59.00\",         " +
"			\"黄喉 x6¥59.00\",               " +
"			\"菌花 x6¥59.00\",               " +
"			\"腰片 x6¥59.00\",               " +
"			\"虾滑 x6¥59.00\",               " +
"			\"肥牛 x2¥59.00\",               " +
"			\"大白菜 x1¥59.00\",         " +
"			\"白萝卜 x3¥59.00\",         " +
"			\"千层肚 x5¥59.00\",         " +
"			\"黄喉 x6¥59.00\",               " +
"			\"菌花 x6¥59.00\",               " +
"			\"腰片 x6¥59.00\",               " +
"			\"虾滑 x6¥59.00\",				" +
"			] }";


        static void Main(string[] args)
        {
            var mq = new Producer
            {
                Topic = "DESKTOP-ACRFQSI",
                NameServerAddress = "192.168.1.194:9876",
                //Log = XTrace.Log,
            };
            mq.Start();

            //发送消息方式一,可以设置key
            NewLife.RocketMQ.Protocol.Message message = new NewLife.RocketMQ.Protocol.Message()
            {
                BodyString = json2,          
                Keys ="key002",
                Tags = "TagC",
                Flag = 0,
                WaitStoreMsgOK = true
            };
            var sr = mq.Publish(message);

            //发送消息方式二
            //var sr = mq.Publish(json2, "TagA");
            string log = $"发送成功的消息,内容>{json2},MsgId={sr.MsgId},BrokerName= {sr.Queue.BrokerName} ,QueueId={sr.Queue.QueueId},QueueOffset= {sr.QueueOffset}";
            Console.WriteLine(log);
            // 阿里云发送消息不能过快,否则报错“服务不可用”
            LogHelpter.AddLog(log);

            Console.WriteLine("完成");
            mq.Dispose();
            Console.ReadLine();


        }
    }
}

消费消息

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp_Consumer
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("消息接收测试");
            //测试消费消息
            var consumer = new NewLife.RocketMQ.Consumer
            {
                Topic = "DESKTOP-ACRFQSI",
                Group = "CID_ONSAPI_OWNER",
                NameServerAddress = "192.168.1.194:9876",
                //设置每次接收消息只拉取一条信息
                BatchSize = 1,
                //FromLastOffset = true,
                //SkipOverStoredMsgCount = 0,
                //BatchSize = 20,
                //Log = NewLife.Log.XTrace.Log,
            };
            consumer.OnConsume = (q, ms) =>
            {
                string mInfo= $"BrokerName={q.BrokerName},QueueId={q.QueueId},Length={ms.Length}";
                Console.WriteLine(mInfo);
                foreach (var item in ms.ToList())
                {
                    string msg = $"消息:msgId={item.MsgId},key={item.Keys},产生时间【{item.BornTimestamp.ToDateTime()}】,内容>{item.Body.ToStr()}";
                    Console.WriteLine(msg);
                }
             //   return false;//通知消息队:不消费消息
               return true;		//通知消息队:消费了消息
            };
      
            consumer.Start();
            Console.ReadLine();
        }
    }
}

停止接收RocketMq消息,

          consumer.OnConsume = null;
          consumer.Dispose();

重新启动接收参考:

  
     static Func<MessageQueue, MessageExt[], bool> reviceMsgFunc= (q, ms) =>
   {
			//     string mInfo = $"BrokerName={q.BrokerName},QueueId={q.QueueId},Length={ms.Length}";
			//	Console.WriteLine(mInfo);
			//     LogHelpter.AddLog("********收到消息结构>" + mInfo);
					foreach (var item in ms.ToList())
					{
						string msg = $"消息msgId={item.MsgId},key={item.Keys},QueueOffset={item.QueueOffset},产生时间【{item.BornTimestamp.ToDateTime()}】,内容>{item.Body.ToStr()}";
						Console.WriteLine(msg);
						LogHelpter.AddLog("收到消息>" + msg);
					}
					//   return false;//不消费
					return true;//消费了消息
	};
  
  //启动
 Task.Run(() =>
 {
     System.Threading.Thread.Sleep(50 * 1000);
     try
     {
         consumer = new NewLife.RocketMQ.Consumer
         {
             Topic = "topic_order_list_print",
             Group = "group_order_print",
             NameServerAddress = "127.0.0.1:9876",
             //设置每次接收消息只拉取一条信息
             BatchSize = 1,
             //FromLastOffset = true,
             //SkipOverStoredMsgCount = 0,
             //BatchSize = 20,
             //Log = NewLife.Log.XTrace.Log,
         };
         consumer.OnConsume = reviceMsgFunc;
         consumer.Start();
         //consumer.StartSchedule();
         string log = "再次启动接收消息,成功" + DateTime.Now.ToFullString();
         Console.WriteLine(log);
         LogHelpter.AddLog(log);
         Console.ReadLine();
     }
     catch (Exception ex)
     {
         Console.WriteLine("再次启动接收消息出错" + ex.Message);
         LogHelpter.AddLog("再次启动接收消息出错," + ex.Message);
     }
 });

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
您又发现了一个问题,这个代码确实没有实现返回上一代的功能。在代码中添加一个变量 `generation` 来记录当前的代数,然后在回滚时将代数减1,就可以回到上一代。可以按照以下方式修改代码: ```c++ int generation = 0; // 添加一个变量来记录当前的代数 A.init(ROWS, COLS, life); while (true) { A.display(ROWS, COLS, life); string input; loop: cout << "Type 's' to save, 'l' to load, 'c' to change,'s' to stop, 'r' to rollback, or any other key to continue: "; cin >> input; if (input == "s") { string fileName; cout << "Enter file name: "; cin >> fileName; A.saveBoard(life, fileName, ROWS, COLS); } else if (input == "r") { if (generation == 0) { cout << "Cannot rollback anymore!" << endl; } else { generation--; for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { life[i][j] = oldlife[i][j]; } } A.display(ROWS, COLS, life); } } else if (input == "l") { string fileName; cout << "Enter file name: "; cin >> fileName; A.loadBoard(life, fileName, ROWS, COLS); } else if (input == "c") { int x, y; cin >> x >> y; if (x >= 0 && x < ROWS && y >= 0 && y < COLS) { life[x][y] = ~life[x][y]; A.display(ROWS, COLS, life); goto loop; } else { cout << "Invalid position!" << endl; } } else if (input == "s") { break; } A.run(ROWS, COLS, life, newLife); generation++; // 更新当前的代数 for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { oldlife[i][j] = life[i][j]; } } } ``` 这样,当用户输入"r"时,如果当前的代数为0,代码会输出一个提示信息;否则,代码会将代数减1,并将oldlife的值复制到life中,然后再显示出来,实现了返回上一代的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王焜棟琦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值