MQ的调用
mq调用(相关dll)
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace MqTest2
{
class Program
{ static void Main(string[] args)
{ }
/// <summary>
/// 获取数据
/// </summary>
static public void GetData()
{
MqHelper mqHelper = new MqHelper();
var e = mqHelper.GetMQMsg();
byte[] data = null;
if (e !=null)
{
data = e.Body;
var result = Encoding.UTF8.GetString(data);
}
}
/// <summary>
/// 发送数据
/// </summary>
static public void SendData()
{
MqHelper mqHelper = new MqHelper();
Student student = new Student()
{
name = "测试",
Age = ""
};
string errorMsg = string.Empty;
mqHelper.sendMQMessage(student, out errorMsg);//发送数据
}
} public class Student
{ public string name { get; set; } public string Age { get; set; }
} }
mq帮助类
using Newtonsoft.Json;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace MqTest2
{
class MqHelper
{
private IModel _channel;
private QueueingBasicConsumer _consumer;
private IDictionary<string, IModel> _channels;
public RabbitMQConfigSection_New RabbitMQConfigSection { get; private set; }
private readonly object _syncRoot = new object();
public ConnectionFactory Factory { get; private set; }
private IConnection Connection { get; set; }
string RoutingKeys = "CDP.Finish";//路由键(多个路由中间用,隔开)
string QueueName = "Citms.Queue.VideoTest";//队列名称
string ExchangeName = "Citms.Exchange.Test";//交换机名称
string SendRoutingKey = "CDP.Finish";//发送路由键 public MqHelper()
{
this._channels = new Dictionary<string, IModel>();
this.RabbitMQConfigSection = new RabbitMQConfigSection_New();
Factory = new ConnectionFactory();
Factory.UserName = this.RabbitMQConfigSection.RabbitMQUserName;
Factory.Password = this.RabbitMQConfigSection.RabbitMQPassword;
Factory.VirtualHost = "/";
Factory.Uri = this.RabbitMQConfigSection.RabbitMQUri;
CreateConsumer();
}
/// <summary>
/// 创建路由
/// </summary>
public void CreateConsumer()
{
try
{
_channel = GetNamedChannel(QueueName);
_channel.BasicQos(, , false);
GetChannel().QueueDeclare(QueueName, true, false, false, null);
if (!string.IsNullOrEmpty(RoutingKeys))
{
// 支持绑定多个路由键
string[] rks = RoutingKeys.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var rk in rks)
{
GetChannel().QueueBind(
QueueName,
ExchangeName,
rk.Trim()
);
}
}
this._consumer = new QueueingBasicConsumer(_channel);
_channel.BasicConsume(QueueName, false, this._consumer);
} catch (Exception ex)
{
throw (ex);
}
}
/// <summary>
/// 获取消息队列内容
/// </summary>
/// <returns></returns>
public BasicDeliverEventArgs GetMQMsg()
{
try
{
BasicDeliverEventArgs a;
bool status = this._consumer.Queue.Dequeue(, out a);//队列为空时结束挂起,不做这个判断当队列为空时会一直超时
if (status)
{
return a;
}
else
{
return null;
}
}
catch (Exception ex)
{ if (this._consumer == null || !this._consumer.IsRunning)
{
this.CreateConsumer();
}
throw;
}
}
/// <summary>
/// 发送队列消息
/// </summary>
/// <param name="iv"></param>
/// <param name="errorMsg"></param>
/// <returns></returns>
public bool sendMQMessage(Student iv, out string errorMsg)
{
errorMsg = "";
dynamic obj = new { DataType = "Student", Data = iv, ReportedTime = "" };
string value = JsonConvert.SerializeObject(obj);
try
{
lock (_channel)
{
_channel.ExchangeDeclare(ExchangeName, "direct", true);
byte[] bytes = Encoding.UTF8.GetBytes(value);
_channel.BasicPublish(ExchangeName, SendRoutingKey, null, bytes);
return true;
}
}
catch (Exception ex)
{
errorMsg = ex.Message;
return false;
}
}
/// <summary>
/// 获取 rabbitmq 通道
/// </summary>
/// <returns></returns>
public IModel GetChannel()
{
lock (this._syncRoot)
{
// 最多重试 4 次
for (int i = ; i < ; ++i)
{
try
{
// 通道为 null,重新创建
if (this._channel == null)
{
this._channel = this.GetConnection().CreateModel();
return this._channel;
}
// 通道不为 null,并且已经打开,直接返回
if (this._channel.IsOpen)
{
return this._channel;
}
// 通道不为 null,但是没有打开,关闭通道,continue
else
{
this._channel.Dispose();
this._channel = null;
// 随机休眠之后再试
int sleep = ;
Thread.Sleep(sleep);
continue;
}
}
catch (Exception ex)
{ }
finally
{ }
} return null;
}
}
/// <summary>
/// 获取命名通道.
/// </summary>
/// <param name="name">The name.</param>
/// <returns></returns>
public IModel GetNamedChannel(string name)
{
IModel channel;
lock (this._syncRoot)
{
for (int i = ; i < ; ++i)
{
try
{
// 通道为 null,重新创建
if (!this._channels.TryGetValue(name, out channel))
{
channel = this.GetConnection().CreateModel();
this._channels[name] = channel;
return channel;
}
// 通道不为 null,并且已经打开,直接返回
if (channel.IsOpen)
{
return channel;
}
// 通道不为 null,但是没有打开,关闭通道,continue
else
{
channel.Dispose();
channel = null;
this._channels.Remove(name);
// 随机休眠之后再试
int sleep = ;
Thread.Sleep(sleep);
continue;
}
}
catch (Exception ex)
{
throw;
}
finally
{ }
} return null;
}
}
public IConnection GetConnection()
{
lock (_syncRoot)
{
try
{
// 连接为 null,创建之
if (this.Connection == null)
{
if (this.Factory == null)
{ }
this.Connection = this.Factory.CreateConnection();
return this.Connection;
}
// 连接不为 null,但是状态不是已打开,关闭连接并重新创建连接
if (!this.Connection.IsOpen)
{
try
{
// 释放连接
this.Connection.Dispose();
this.Connection = null;
}
catch (Exception ex)
{
this.Connection = null;
}
finally
{
// 创建新连接
this.Connection = this.Factory.CreateConnection(); }
}
// 返回连接对象
return this.Connection;
}
catch (Exception ex)
{ throw ex;
}
}
} }
public class RabbitMQConfigSection_New
{ public string RabbitMQUri { get; set; } = "amqp://192.168.0.37:5672"; public string RabbitMQUserName { get; set; } = "citms"; public string RabbitMQPassword { get; set; } = "citms@b7";
}
}
MQ的调用的更多相关文章
- 使用rabbit mq.模拟dubbo,使MQ异步调用代码写起来像是同步方法.
最近在改造老系统,遇到了需要使用rabbitMq的场景.在以前使用的过程中需要在发送端和消费端各种配置,感觉比较麻烦,然后突然想到了dubbo中@Reference注解的形式,可不可以做一个类似的架子 ...
- .Net Core 商城微服务项目系列(十一):MQ消费端独立为Window服务+消息处理服务
之前使用MQ的时候是通过封装成dll发布Nuget包来使用,消息的发布和消费都耦合在使用的站点和服务里,这样会造成两个问题: 1.增加服务和站点的压力,因为每次消息的消费就意味着接口的调用,这部分的压 ...
- MQ脚本回放报错2059
1.响应2059错误 1.1. 涉及协议 MQ,调试回放阶段 1.2. 错误信息 完成码2原因为2059:未能为 '10.200.100.75:QMEMBFE' 创建 MQQueueManag ...
- java.lang.NoClassDefFoundError: Could not initialize class xxx 原因
一.问题及原因 程序里有个工具类,主要是调用它的静态方法来发送mq. 调用场景如下: 结果这两天报了个错: java.lang.NoClassDefFoundError: Could not init ...
- Kafka实践、升级和新版本(0.10)特性预研
本文来自于网易云社区 一.消息总线MQ和Kafka (挡在请求的第一线) 1. 几个应用场景 case a:上游系统往下游系统推送消息,而不关心处理结果: case b:一份新数据生成,需要实时保存到 ...
- ActiveMQ入门系列之应用:Springboot+ActiveMQ+JavaMail实现异步邮件发送
现在邮件发送功能已经是几乎每个系统或网址必备的功能了,从用户注册的确认到找回密码再到消息提醒,这些功能普遍的会用到邮件发送功能.我们都买过火车票,买完后会有邮件提醒,有时候邮件并不是买完票立马就能收到 ...
- 智能可视化搭建系统 Atom 服务架构演变
作者:凹凸曼 - Manjiz Atom 是什么?Atom 是集结业内各色资深电商行业设计师,提供一站式专业智能页面和小程序设计服务的平台.经过 2 年紧凑迭代,项目越来越庞大,需求不断变更优化,内部 ...
- 在.NET Core 中收集数据的几种方式
APM是一种应用性能监控工具,可以帮助理解系统行为, 用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题, 通过汇聚业务系统各处理环节的实时数据,分析业务系统各事务处理的交易路径和处理 ...
- SpringCloud(六)分布式事务
在分布式系统中,分布式事务基本上是绕不开的, 分布式事务是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上 .其实就可以简单理解成在分布式系统中实现事务 ...
随机推荐
- Activiti工作流数据库表结构
Activiti工作流引擎数据库表结构 数据库表的命名 Acitiviti数据库中表的命名都是以ACT_开头的.第二部分是一个两个字符用例表的标识.此用例大体与服务API是匹配的. ACT_RE_*: ...
- springmvc启动加载指定方法
官网: https://docs.oracle.com/javaee/7/api/javax/annotation/PostConstruct.htmlblog:https://blog.csdn.n ...
- 查看mysql进程
show processlist; show full processlist;
- 安装mysql过程中的异常解决
[root@cdh1 ruanjian]# rpm -ivh mysql-community-common-5.7.10-1.el6.x86_64.rpm warning: mysql-comm ...
- Codeforces1303D. Fill The Bag
1e18对应2进制有58位,可以直接暴力模拟,因为读入的数都是2次幂,__builtin_ctz这个内置gcc函数可以算出二进制下末尾有几个0,读入时统计,然后从n的最低位开始判断,注意每次升位的时候 ...
- 应用内打开AppStore上某个应用的下载界面--SKStoreReviewController的使用
产品设计要求是这样的: 对应的初步代码是这样的: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after ...
- 《iOS开发进阶》书籍目录
第一部分:iOS开发工具 第二部分:iOS开发实践 第10章 理解内存管理 10.1 引用计数 10.1.1 什么是引用计数,原理是什么 10.1.2 我们为什么需要引用计数 10.1.3 不要向已经 ...
- 九 SpringMvc与json交互
将json输出到页面: 1 加入jar包 2 配置Controller层,开启注解ResponseBody,将json发送到页面: 3 访问url 4 响应json,在形参列表里面加上注解
- Springboot 项目启动设置
//配置默认访问路径 并且自动打开浏览器 需要创建独立文件 @Controller public class HomeController { @RequestMapping("/ ...
- 吴裕雄--天生自然HADOOP学习笔记:hadoop集群实现PageRank算法实验报告
实验课程名称:大数据处理技术 实验项目名称:hadoop集群实现PageRank算法 实验类型:综合性 实验日期:2018年 6 月4日-6月14日 学生姓名 吴裕雄 学号 15210120331 班 ...