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 ...
随机推荐
- 爱特梅尔ATMEL全系列芯片解密单片机破解
爱特梅尔ATMEL全系列芯片解密单片机破解 ATMEL芯片介绍: ATMEL公司为全球性的业界领先企业,致力于设计和制造各类微控制器.电容式触摸解决方案.先进逻辑.混合信号.非易失性存储器和射频 (R ...
- Daily Scrum Meeting ——FifthDay
一.Daily Scrum Meeting照片 牛姐去工程师那边了,已经在群里给我汇报了.橙汁去北京参加ICPC了 二.Burndown Chart 渐入佳境了,最后一礼拜了 三.项目进展 1.实现注 ...
- Java -> 把Excel表格中的数据写入数据库与从数据库中读出到本地 (未完善)
写入:没有关闭流,容错并不完善. private void insertFile(HttpServletRequest request, HttpServletResponse response) t ...
- java基础-接口
浏览以下内容前,请点击并阅读 声明 接口是java语言中的一个引用类型,和类一样,接口可以包含常量,方法签名,默认方法,静态方法和嵌套类型.含有方法主体的只有其中的默认方法和静态方法.接口不能被实例化 ...
- Leetcode Minimum Window Substring
Given a string S and a string T, find the minimum window in S which will contain all the characters ...
- oracle[insert 时报错: 单行子查询返回多行]
-- 错误的写法 insert into t_b_partner_vehicle(id, partner_id, vehicle_id) (seq_t_b_partner_vehicle.nextva ...
- 目录的文件权限-X
所有目录务必保持具有X权限(可执行权限)!!,否则无法进入该目录及子目录,且无法读取该目录及子目录下的文件或子目录
- css3动态旋转魔方练习
图片素材: html部分: <!DOCTYPE html><html><head> <meta charset="utf-8" /> ...
- HTML基础篇之列表相关标签和特殊字符实体
HTML字符实体 常用的字符实体: 实体字符 字符实体 大于号 (>) > 小于号 (<) < 引号 (") " 注册商标(®) ® 版权(© ) © &a ...
- python与shell的3种交互方式介绍
[目录] 1.os.system(cmd) 2.os.popen(cmd) 3.利用subprocess模块 4.subprocessor模块进阶 [概述] 考虑这样一个问题,有hello.py脚本, ...