在Linux系统中运行并简单的测试RabbitMq容器

以前使用的是Windows下面的RabbitMq,需要先安装 Erlang的语言环境等,这次直接在Linux中的Docker容器来测试一下

1:docker配置RabbitMq的指令

  docker run -d --hostname myrabbit --restart=always --name rabbitmq -p 5672:5672 -p 15672:15672 
  -e RABBITMQ_DEFAULT_USER=fengge -e RABBITMQ_DEFAULT_PASS=qqlove rabbitmq:3-management

  指令的含义应该都看得明白,这里不在描述了

2:查看RbbitMq容器已经启起来

3:代码:

 Product生产者测试代码:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9 using System.Windows.Forms;
10
11 namespace WindowsForms
12 {
13     using RabbitMQ.Client;
14     using RabbitMQ;
15     using RabbitMQ.Client.Framing.Impl;
16     using RabbitMQ.Util;
17     using RabbitMQ.Client.Framing;
18     using RabbitMQ.Client.Events;
19
20     public partial class RbbitMqSendMsg : Form
21     {
22         private static readonly string queueName = "insert_to_person";
23         private static readonly string exchangeName = "Insert";
24         private static readonly string ruterKey = "router.Insert";
25
26
27         /*
28          direct,fanout,topic,headers
29             直接,    扇出,主题, 标题
30              */
31         private static readonly string exchangeType = "direct";
32         private static readonly ConnectionFactory rabitFactory = new ConnectionFactory
33         {
34             UserName = "fengge",
35             Password = "F88",
36             RequestedHeartbeat = 0,
37             Endpoint = new AmqpTcpEndpoint(new Uri("amqp://192.168.***.***:5672/"))
38         };
39         public RbbitMqSendMsg()
40         {
41             InitializeComponent();
42         }
43         private void SimpelMQ()
44         {
45             try
46             {
47                 //创建一个连接的工厂
48                 using (var conn = rabitFactory.CreateConnection())
49                 {
50                     //类似创建一个管道
51                     using (var channel = conn.CreateModel())
52                     {
53                         //声明一个队列,设置队列是否持久化,排他性,与自动删除
54                         channel.ExchangeDeclare(exchangeName, exchangeType);
55                         channel.QueueDeclare(queueName, true, false, false);
56                         // 绑定消息队列,交换器,routingkey
57                         channel.QueueBind(queueName, exchangeName,routingKey: queueName);
58                         IBasicProperties propertity = channel.CreateBasicProperties();
59                         propertity.Persistent = true;//队列持久化
60                         for (int i = 0; i < 100; i++)
61                         {
62                             byte[] bymsg = Encoding.UTF8.GetBytes($"我是风格{i},现在时间是:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")}");
63                             channel.BasicPublish(exchangeName, ruterKey, propertity, bymsg);
64                         }
65                     }
66                 }
67             }
68             catch (Exception e)
69             {
70                 throw new Exception(e.Message);
71             }
72         }
73
74         private void SampleTypeSend_Click(object sender, EventArgs e)
75         {
76             SimpelMQ();
77         }
78     }
79 }

 Consumer消费者测试代码:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9 using System.Windows.Forms;
10
11 namespace WindowsForms02
12 {
13     using RabbitMQ.Client;
14     public partial class Form1 : Form
15     {
16         private static readonly string queueName = "insert_to_person";
17         private static readonly string exchangeName = "Insert";
18         private static readonly string ruterKey = "router.Insert";
19
20
21         /*
22          direct,fanout,topic,headers
23             直接,    扇出,主题, 标题
24              */
25         private static readonly string exchangeType = "direct";
26         private static readonly ConnectionFactory rabitFactory = new ConnectionFactory
27         {
28             UserName = "fengge",
29             Password = "F88",
30             RequestedHeartbeat = 0,
31             Endpoint = new AmqpTcpEndpoint(new Uri("amqp://192.168.***.***:5672/")),
32         };
33         public Form1()
34         {
35             InitializeComponent();
36             System.Threading.Thread t2 = new System.Threading.Thread(() => {
37                 ConsumerMsgSimpleMq();
38             });
39             t2.IsBackground = true; t2.Start();
40         }
41
42
43         private void ConsumerMsgSimpleMq()
44         {
45             //创建一个连接的工厂
46             using (var conn = rabitFactory.CreateConnection())
47             {
48                 //类似创建一个管道
49                 using (var channel = conn.CreateModel())
50                 {
51                     channel.ExchangeDeclare(exchangeName, exchangeType);
52                     //声明一个队列,设置队列是否持久化,排他性,与自动删除
53                     channel.QueueDeclare(queueName, true, false, false);
54                     // 绑定消息队列,交换器,routingkey
55                     channel.QueueBind(queueName, exchangeName, ruterKey);
56                     ////定义这个队列的消费者
57                     //QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);
58                     ////false为手动应答,true为自动应答
59                     //channel.BasicConsume(queueName, false, consumer);
60                     while (true)
61                     {
62                         try
63                         {
64                             BasicGetResult result = channel.BasicGet(queueName, false);
65                             if (result != null)
66                             {
67                                 byte[] by = result.Body;
68                                 string messageStr = Encoding.UTF8.GetString(by);
69                                 //如果是自动应答,下下面这句代码不用写啦。
70                                 Console.WriteLine("---->" + messageStr);
71                                 if (!string.IsNullOrEmpty(messageStr))
72                                 {
73                                     channel.BasicAck(result.DeliveryTag, false);
74                                 }
75                             }
76                         }
77                         catch (Exception)
78                         {
79                         }
80                     }
81                 }
82             }
83         }
84     }
85 }

4:启动多个客服端,其他的启动我们可以以调试的模式打开客服端

5:测试的效果:

原文地址:https://www.cnblogs.com/Fengge518/p/12037296.html

时间: 2024-10-11 08:12:11

在Linux系统中运行并简单的测试RabbitMq容器的相关文章

学习Linux系统中命令的简单方法

如果说如何快速学习.了解Linux的话,我的答案是学命令.背命令!为何呢?对于一名新手来说,去学习Linux的思想.了解Linux的架构.明白Linux中"一切皆文件"概念虽然说是没有错,是对的.但是个人认为去学习这些"高大上"的东西不是一时半会的事儿,它需要一定的时间和经验去沉淀才能掌握.那么如何最快速了解Linux并使用呢?我依然觉得学命令.背命令,掌握命令是比较笨但却是比较快的方式. 我开始学习Linux的时候,问了前辈:我入门Linux需要掌握哪些命令呢?前

每天进步一点点——Linux系统中的异常堆栈跟踪简单实现

转载请说明出处:http://blog.csdn.net/cywosp/article/details/25002201 在Linux中做C/C++开发经常会遇到一些不可预知的问题导致程序崩溃,同时崩溃后也没留下任何代码运行痕迹,因此,堆栈跟踪技术就显得非要重要了.本文将简单介绍Linux中C/C++程序运行时堆栈获取,首先来看backtrace系列函数--使用范围适合于没有安装GDB或者想要快速理清楚函数调用顺序的情况 ,头文件execinfo.h int backtrace (void **

浅谈Linux系统中的7种运行级别及其原理

浅谈Linux系统中的7种运行级别 Linux系统7个运行级别(runlevel): 运行级别0: 系统停机状态,系统默认运行级别不能设为0,否则不能正常启动. 运行级别1: 单用户工作状态,root权限,用于系统维护,禁止远程登陆. 运行级别2: 多用户状态(没有NFS). 运行级别3: 完全的多用户状态(有NFS),登陆后进入控制台命令行模式. 运行级别4: 系统未使用,保留. 运行级别5: X11控制台,登陆后进入图形GUI模式. 运行级别6: 系统正常关闭并重启,默认运行级别不能设为6,

LINUX系统中动态链接库的创建与使用{补充}

大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部分,而是根据执行程序需要按需装入,同时其执行代码可在多个执行程序间共享,节省了空间,提高了效率,具备很高的灵活性,得到越来越多程序员和用户的青睐.那么,在LINUX系统中有无这样的函数库呢? 答案是肯定的,LINUX的动态链接库不仅有,而且为数不少.在/lib目录下,就有许多以.so作后缀的文件,这

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用ELF格

LINUX系统中动态链接库的创建与使用

大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部分,而是根据执行程序需要按需装入,同时其执行代码可在多个执行程序间共享,节省了空间,提高了效率,具备很高的灵活性,得到越来越多程序员和用户的青睐.那么,在LINUX系统中有无这样的函数库呢? 答案是肯定的,LINUX的动态链接库不仅有,而且为数不少.在/lib目录下,就有许多以.so作后缀的文件,这

Linux系统中“动态库”和“静态库”那点事儿【转】

转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式.ELF(Executable and Linking Format,可执行连接格式)是UNIX系统实验室(USL)作为应用程序二进制

exit()与_exit()函数的区别(Linux系统中)

注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXIT_SUCCESS);可读性比较好一点. 作为系统调用而言,_exit和exit是一对孪生兄弟,它们究竟相似到什么程度,我们可以从Linux的源码中找到答案: #define __NR__exit __NR_exit /* 摘自文件include/asm-i386/unistd.h第334行 */

理解Linux系统中的load average

理解Linux系统中的load average(图文版) 博客分类: Linux linux load nagios 一.什么是load average? linux系统中的Load对当前CPU工作量的度量 (WikiPedia: the system load is a measure of the amount of work that a computer system is doing).也有简单的说是进程队列的长度. Load Average 就是一段时间 (1 分钟.5分钟.15分钟