1.采用发布订阅模式
消息发布方:
public static void SendCommand_Fanout()
{
while (true)
{
JObject joMessage = new JObject();
joMessage.Add("to", "all");
joMessage.Add("from", "zsw");
joMessage.Add("type", "Fanout");
joMessage.Add("message", "hello everyone!");
joMessage.Add("time", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
JObject jo = new JObject();
jo.Add("command", "chat");
jo.Add("data", JsonHelper.GetClearString(joMessage));
string message = JsonHelper.GetClearString(jo);
string exchange = "commandExchange";
try
{
using (IConnection connection = CreateMQConnection())
{
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange, ExchangeType.Fanout);
channel.BasicPublish(exchange, "", null, Encoding.UTF8.GetBytes(message));
Console.WriteLine(string.Format("Fanout publish message:{0}", message));
}
}
}
catch (Exception ex)
{
throw ex;
}
Thread.Sleep(3000);
}
}
消息接收方:
//订阅模式
static void Subscribe()
{
string exchange = "commandExchange";
using (IConnection connection = CreateMQConnection())
{
using (IModel channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange, ExchangeType.Fanout);
var queueName = channel.QueueDeclare();
IDictionary props = new Dictionary<string, string>();
channel.QueueBind(queueName, exchange, "", props);
QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);
channel.BasicConsume(queueName, false, consumer);
while (true)
{
try
{
BasicDeliverEventArgs e = (BasicDeliverEventArgs) consumer.Queue.Dequeue();
var message = Encoding.UTF8.GetString(e.Body);
channel.BasicAck(e.DeliveryTag, false);//确认删除
ParaseMessage(message);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
break;
}
}
}
}
}
使用上篇文章建立的配置信息:
private static IConnection CreateMQConnection()
{
ConnectionFactory factory = new ConnectionFactory();
factory.Uri = "amqp://zsw:123456@localhost:5672/mq_swzhou";
return factory.CreateConnection();
}
2. 采用Direct方式,并使用主动获取消费
消息发布方:
public static void SendCommand_Direct()
{
while (true)
{
JObject joMessage = new JObject();
joMessage.Add("to", "all");
joMessage.Add("from", "zsw");
joMessage.Add("message", "hello everyone!");
joMessage.Add("type", "Direct");
joMessage.Add("time", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
JObject jo = new JObject();
jo.Add("command", "chat");
jo.Add("data", JsonHelper.GetClearString(joMessage));
string message = JsonHelper.GetClearString(jo);
string _requestExchange = "e1";
string route = "r1";
string queue = "q1";
try
{
using (IConnection connection = CreateMQConnection())
{
using (IModel channel = connection.CreateModel())
{
channel.ExchangeDeclare(_requestExchange, "direct");
channel.QueueDeclare(queue, true, false, false, null);
channel.QueueBind(queue, _requestExchange, route);
channel.BasicPublish(_requestExchange, route, null, Encoding.UTF8.GetBytes(message));
Console.WriteLine(string.Format("Direct publish message:{0}", message));
}
}
}
catch (Exception ex)
{
throw ex;
}
Thread.Sleep(3000);
}
}
消息接收方:
//主动获取模式
private static void InitiativeGet()
{
using (IConnection conn = CreateMQConnection())
{
using (IModel ch = conn.CreateModel())
{
while (true)
{
BasicGetResult res = ch.BasicGet("q1", false/*noAck*/);
if (res != null)
{
try
{
string message = UTF8Encoding.UTF8.GetString(res.Body);
ParaseMessage(message);
ch.BasicAck(res.DeliveryTag, false);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
else
continue;
}
}
}
}