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 ...
随机推荐
- 在SQL SERVER中实现RSA加解密函数(第一版)
/*************************************************** 作者:herowang(让你望见影子的墙) 日期:2010.1.1 注: 转载请保留此信息 ...
- SwipeRefreshLayout下拉刷新简单用例
自己的下拉刷新组件 下拉刷新并自动添加数据 MainActivity package com.shaoxin.myswiperefreshlayout; import android.graphics ...
- Subsonic简单的语法整理
.查询方面 (查询所有数据记录[dataset读取方法]) Myuser.Query().ExecuteDataSet().Tables[]; Myuser.Query().ExecuteDataSe ...
- Entity Framework 实体框架的形成之旅--实体数据模型 (EDM)的处理(4)
在前面几篇关于Entity Framework 实体框架的介绍里面,已经逐步对整个框架进行了一步步的演化,以期达到统一.高效.可重用性等目的,本文继续探讨基于泛型的仓储模式实体框架方面的改进优化,使我 ...
- iOS 开发技巧收藏贴 链接整理
54个技巧 57个技巧 正则表达式
- Struts2 整合Spring(Maven,注解版)
这两天正在试验Struts2与Spring框架的整合,和他们各自的“注解”.今天就总结一下这两个框架怎么用注解进行整合. 一,加入两者的依赖包,除了两者的必要依赖外,还需要导入struts2-spri ...
- Django分析之国际化处理
最近在公司终于开始做web开发了,本以为会是简单的首页之类的小规模项目,结果上来就是一个处理大数据分析的项目,一个关于油品分析的系统,不过我接到的第一个任务是做这个网站的国际化处理,虽然项目还没有上线 ...
- (转)完全用GNU/Linux工作 by 王珢
完全用GNU/Linux工作 王珢 (看完这篇博文,非常喜欢王珢的这篇博客,也我坚定了学gnu/linux的决心,并努力去按照国外的计算机思维模式去学习编程提高自己.看完这篇文章令我热血沸腾 ...
- AJAX实现跨域的三种方法
由于在工作中需要使用AJAX请求其他域名下的请求,但是会出现拒绝访问的情况,这是因为基于安全的考虑,AJAX只能访问本地的资源,而不能跨域访问. 比如说你的网站域名是aaa.com,想要通过AJAX请 ...
- Codeforces Round #371 (Div. 2) C
传送门 map或者字典数的应用 简单题 题意: 思路: AC代码: #include<iostream> #include<cstring> #include<cmat ...