ActiveMQ 复杂类型的发布与订阅
很久没po文章了,但是看到.Net里关于ActiveMQ发送复杂类型的文章确实太少了,所以贴出来和大家分享
发布:
//消息发布
public class Publisher
{
private IConnection _connection;
private ISession _session;
private IMessageProducer _producer; /// <summary>
/// 初始化
/// </summary>
/// <param name="brokerUrl">广播地址</param>
/// <param name="queueDestination">队列目标</param>
public void Init(string brokerUrl = "tcp://localhost:61616", string queueDestination = "nms.msg.topic")
{
try
{
IConnectionFactory connectionFactory = new ConnectionFactory(brokerUrl);
_connection = connectionFactory.CreateConnection();
_connection.Start();
_session = _connection.CreateSession();
IDestination destination = _session.GetTopic(queueDestination);
_producer = _session.CreateProducer(destination);
}
catch (Exception e)
{
Log.Error($"activemq初始化异常:{e.InnerException.ToString()}");
}
} public void Close()
{
_session.Close();
_connection.Close();
} /// <summary>
/// 发送普通字符串消息
/// </summary>
/// <param name="text">字符串</param>
public void SendText(string text)
{
ITextMessage objecto = _producer.CreateTextMessage(text);
_producer.Send(objecto);
} /// <summary>
/// 发送对象消息
/// </summary>
/// <param name="mapMessages">MapMessage对象</param>
/// <returns></returns>
public bool SendObject(List<MapMessage> mapMessages)
{
bool result = true;
if (mapMessages == null || mapMessages.Count < 0) return false;
foreach (var mapMessage in mapMessages)
{
var message = _producer.CreateMapMessage();
ActiveCommon.SetMapMessage<MapMessage>(message, mapMessage);
try
{
_producer.Send(message);
result = true;
}
catch (Exception e)
{
Log.Error($"activemq发送美好异常:{e.InnerException.ToString()}");
result = false;
}
}
return result;
} /// <summary>
/// 获取对象XML结果
/// </summary>
/// <param name="m">对象</param>
/// <returns></returns>
public string GetXmlStr(object m)
{
return _producer.CreateXmlMessage(m).Text;
}
}
订阅:
//消息订阅
class Subsriber
{
private IConnection _connection;
private ISession _session;
private IMessageConsumer _consumer; /// <summary>
/// 初始化
/// </summary>
/// <param name="brokerUrl">广播地址</param>
/// <param name="queueDestination">队列目标</param>
public void Init(string brokerUrl = "tcp://localhost:61616", string queueDestination = "nms.msg.topic")
{
try
{
IConnectionFactory connectionFactory = new ConnectionFactory(brokerUrl);
_connection = connectionFactory.CreateConnection();
_connection.Start();
_session = _connection.CreateSession();
IDestination destination = _session.GetTopic(queueDestination);
_consumer = _session.CreateConsumer(destination);
_consumer.Listener += _consumer_Listener; }
catch (Exception e)
{
Log.Error($"activemq初始化异常:{e.InnerException.ToString()}");
} } private void _consumer_Listener(IMessage message)
{
var model = ActiveCommon.GetMapMessageByIMapMessage((IMapMessage)message);
Log.Infor($"订阅接收:{_session.CreateXmlMessage(model).Text}");
}
}
复杂类型处理:
public class ActiveCommon
{
//设置Message的Body信息
public static void SetMapMessage<T>(IMapMessage mapMessage, T messages)
{
if (mapMessage == null || object.Equals(messages, null))
{
return;
} foreach (var propertyInfo in messages.GetType().GetProperties())
{
if (propertyInfo.PropertyType.Name == "String")
mapMessage.Body.SetString(propertyInfo.Name, Convert.ToString(propertyInfo.GetValue(messages, null)));
else
mapMessage.Body.SetInt(propertyInfo.Name, Convert.ToInt16(propertyInfo.GetValue(messages, null)));
}
} public static MapMessage GetMapMessageByIMapMessage(IMapMessage mapMessage)
{
if (mapMessage == null)
{
return null;
} var MapMessage = new MapMessage();
foreach (var propertyInfo in MapMessage.GetType().GetProperties())
{
propertyInfo.SetValue(MapMessage, mapMessage.Body[propertyInfo.Name], null);
} return MapMessage;
} public static T GetMapMessageByIMapMessage<T>(IMapMessage mapMessage, T MapMessage)
{
if (mapMessage == null || object.Equals(MapMessage, null))
{
return default(T);
} foreach (var propertyInfo in MapMessage.GetType().GetProperties())
{
propertyInfo.SetValue(MapMessage, mapMessage.Body[propertyInfo.Name.ToUpper()], null);
} return MapMessage;
}
}
重点是跨站点和跨服务器传输的时候,需要通过Message的Body去设置传输参数
ActiveMQ 复杂类型的发布与订阅的更多相关文章
- windows安装ActiveMQ以及点对点以及发布订阅
一.MQ产品的分类 1.RabbitMQ 是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级 ...
- (转)SqlServer 数据库同步的两种方式 (发布、订阅),主从数据库之间的同步
最近在琢磨主从数据库之间的同步,公司正好也需要,在园子里找了一下,看到这篇博文比较详细,比较简单,本人亲自按步骤来过,现在分享给大家. 在这里要提醒大家的是(为了更好的理解,以下是本人自己理解,如有错 ...
- 知方可补不足~SQL2008中的发布与订阅模式
回到目录 作用:完成数据库与数据库的数据同步 原理:源数据库发布需要同时的表,存储过程,或者函数:目标数据库去订阅它,当源发生变化时,目标数据库自己同步,注意,由于这个过程是SQL自动完成的,所以要求 ...
- RabbitMQ官方中文入门教程(PHP版) 第三部分:发布/订阅(Publish/Subscribe)
发布/订阅 在上篇教程中,我们搭建了一个工作队列.每个任务之分发给一个工作者(worker).在本篇教程中,我们要做的之前完全不一样——分发一个消息给多个消费者(consumers).这种模式被称为“ ...
- SQL2005删除复制数据库的发布与订阅的方法(转载)
SQL2005删除复制数据库的发布与订阅的方法 --在测试环境中恢复从正式数据库服务器 上备份下来的bak文件后,正式环境里数据库复制的发布.订阅也被带进来了,结果恢复的数据库无法更改表结构,直接删除 ...
- SQL SERVER发布与订阅 [原创]
一.配置分发 1.配置分发服务器,注:配置发布与订阅,连接SQLSERVER必须用服务器名登录 2.配置分发 3.选择分发服务器 4.选择快照文件夹 5.设置此文件夹的读写权限为everyone 6. ...
- 转载RabbitMQ入门(3)--发布和订阅
发布和订阅 (使用java 客户端) 在先前的指南中,我们创建了一个工作队列.这工作队列后面的假想是每一个任务都被准确的传递给工作者.在这部分我们将会做一些完全不同的事情–我们将一个消息传递给多个消费 ...
- (转)SqlServer2008 数据库同步的两种方式 (发布、订阅)
上篇中说了通过SQL JOB的方式对数据库的同步,这一节作为上一节的延续介绍通过发布订阅的方式实现数据库之间的同步操作.发布订阅份为两个步骤:1.发布.2订阅.首先在数据源数据库服务器上对需要同步的数 ...
- 文成小盆友python-num12 Redis发布与订阅补充,python操作rabbitMQ
本篇主要内容: redis发布与订阅补充 python操作rabbitMQ 一,redis 发布与订阅补充 如下一个简单的监控模型,通过这个模式所有的收听者都能收听到一份数据. 用代码来实现一个red ...
随机推荐
- T-SQL 基础学习 03
局部变量 在T-SQL中,局部变量的名称必须以标记@作为前缀 语法 DECLARE @变量名数据类型 局部变量的赋值 方法一 SET @变量名 = 值 方法二 SELECT @变量名 = 值 SET和 ...
- mysql中,通过脚本设置表的自增列,及自增步长
设置自增列(其实通过navicate可以直接设置的,也方便:要不然可能需要删除列了) ALTER TABLE `domain_dns_tucows` CHANGE `id` `id` INT(11) ...
- node模块函数图解
已截图方式记录模块信息: HTTP模块: 对于网络返回处理状态封装了很多种,我已截图展现 以上状态也是在http协议中包含的状态. http函数: path模块:
- .NET简谈接口
自从面向对象开发方式的出现,抽象的概念就开始日新月异的发展,面向对象编程.面向接口编程.面向组件编程等等:这一系列的概念都是软件工程所追求的思想范畴,高类聚低耦合. 今天我要简谈的是面向对象里面非常重 ...
- 免费领取百度云盘2048G永久空间,永久离线下载特权
百度云盘和360云盘之间的竞争可谓争锋相对,前段时间,百度和360就网盘免费都采取了自己的措施,最终,360一锤定音,直接免费送36T,并且如果你超过了36T的容量,还可以自动免费扩容! 可参看文章: ...
- iOS CADisplayLink 定时器的使用
CADisplayLink 是一个能让我们以和屏幕刷新频率相同的频率将内容刻画到屏幕上的定时器,在应用中创建一个新的CADisplayLink对象,把他添加到一个runloop中,并且给他提供一个ta ...
- viewport
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale= ...
- C 符号
语言的运算符可分为以下几类: 1 算术运算符 用于各类数值运算.包括加(+).减(-).乘(*).除(/).求余(或称模运算,%).自增(++).自减(–)共七种. 2.关系运算符 用于比较运算.包括 ...
- PostGr-SQL 基本概念
http://wenjiesu.iteye.com/blog/801129 [什么是schema?] 究竟什么是schema?这个问题困扰了我很久. 我们只讨论数据库中的schema,而不讨论XML中 ...
- PHP中获取星期的几种方法
PHP中获取星期的几种方法 PHP星期几获取代码: 1 date(l); 2 //data就可以获取英文的星期比如Sunday 3 date(w); 4 //这个可以获取数字星期比如123,注意0 ...