很久没po文章了,但是看到.Net里关于ActiveMQ发送复杂类型的文章确实太少了,所以贴出来和大家分享

发布:

  1. //消息发布
  2. public class Publisher
  3. {
  4. private IConnection _connection;
  5. private ISession _session;
  6. private IMessageProducer _producer;
  7.  
  8. /// <summary>
  9. /// 初始化
  10. /// </summary>
  11. /// <param name="brokerUrl">广播地址</param>
  12. /// <param name="queueDestination">队列目标</param>
  13. public void Init(string brokerUrl = "tcp://localhost:61616", string queueDestination = "nms.msg.topic")
  14. {
  15. try
  16. {
  17. IConnectionFactory connectionFactory = new ConnectionFactory(brokerUrl);
  18. _connection = connectionFactory.CreateConnection();
  19. _connection.Start();
  20. _session = _connection.CreateSession();
  21. IDestination destination = _session.GetTopic(queueDestination);
  22. _producer = _session.CreateProducer(destination);
  23. }
  24. catch (Exception e)
  25. {
  26. Log.Error($"activemq初始化异常:{e.InnerException.ToString()}");
  27. }
  28. }
  29.  
  30. public void Close()
  31. {
  32. _session.Close();
  33. _connection.Close();
  34. }
  35.  
  36. /// <summary>
  37. /// 发送普通字符串消息
  38. /// </summary>
  39. /// <param name="text">字符串</param>
  40. public void SendText(string text)
  41. {
  42. ITextMessage objecto = _producer.CreateTextMessage(text);
  43. _producer.Send(objecto);
  44. }
  45.  
  46. /// <summary>
  47. /// 发送对象消息
  48. /// </summary>
  49. /// <param name="mapMessages">MapMessage对象</param>
  50. /// <returns></returns>
  51. public bool SendObject(List<MapMessage> mapMessages)
  52. {
  53. bool result = true;
  54. if (mapMessages == null || mapMessages.Count < 0) return false;
  55. foreach (var mapMessage in mapMessages)
  56. {
  57. var message = _producer.CreateMapMessage();
  58. ActiveCommon.SetMapMessage<MapMessage>(message, mapMessage);
  59. try
  60. {
  61. _producer.Send(message);
  62. result = true;
  63. }
  64. catch (Exception e)
  65. {
  66. Log.Error($"activemq发送美好异常:{e.InnerException.ToString()}");
  67. result = false;
  68. }
  69. }
  70. return result;
  71. }
  72.  
  73. /// <summary>
  74. /// 获取对象XML结果
  75. /// </summary>
  76. /// <param name="m">对象</param>
  77. /// <returns></returns>
  78. public string GetXmlStr(object m)
  79. {
  80. return _producer.CreateXmlMessage(m).Text;
  81. }
  82. }

  

订阅:

  1. //消息订阅
  2. class Subsriber
  3. {
  4. private IConnection _connection;
  5. private ISession _session;
  6. private IMessageConsumer _consumer;
  7.  
  8. /// <summary>
  9. /// 初始化
  10. /// </summary>
  11. /// <param name="brokerUrl">广播地址</param>
  12. /// <param name="queueDestination">队列目标</param>
  13. public void Init(string brokerUrl = "tcp://localhost:61616", string queueDestination = "nms.msg.topic")
  14. {
  15. try
  16. {
  17. IConnectionFactory connectionFactory = new ConnectionFactory(brokerUrl);
  18. _connection = connectionFactory.CreateConnection();
  19. _connection.Start();
  20. _session = _connection.CreateSession();
  21. IDestination destination = _session.GetTopic(queueDestination);
  22. _consumer = _session.CreateConsumer(destination);
  23. _consumer.Listener += _consumer_Listener;
  24.  
  25. }
  26. catch (Exception e)
  27. {
  28. Log.Error($"activemq初始化异常:{e.InnerException.ToString()}");
  29. }
  30.  
  31. }
  32.  
  33. private void _consumer_Listener(IMessage message)
  34. {
  35. var model = ActiveCommon.GetMapMessageByIMapMessage((IMapMessage)message);
  36. Log.Infor($"订阅接收:{_session.CreateXmlMessage(model).Text}");
  37. }
  38. }

复杂类型处理:

  1. public class ActiveCommon
  2. {
  3. //设置Message的Body信息
  4. public static void SetMapMessage<T>(IMapMessage mapMessage, T messages)
  5. {
  6. if (mapMessage == null || object.Equals(messages, null))
  7. {
  8. return;
  9. }
  10.  
  11. foreach (var propertyInfo in messages.GetType().GetProperties())
  12. {
  13. if (propertyInfo.PropertyType.Name == "String")
  14. mapMessage.Body.SetString(propertyInfo.Name, Convert.ToString(propertyInfo.GetValue(messages, null)));
  15. else
  16. mapMessage.Body.SetInt(propertyInfo.Name, Convert.ToInt16(propertyInfo.GetValue(messages, null)));
  17. }
  18. }
  19.  
  20. public static MapMessage GetMapMessageByIMapMessage(IMapMessage mapMessage)
  21. {
  22. if (mapMessage == null)
  23. {
  24. return null;
  25. }
  26.  
  27. var MapMessage = new MapMessage();
  28. foreach (var propertyInfo in MapMessage.GetType().GetProperties())
  29. {
  30. propertyInfo.SetValue(MapMessage, mapMessage.Body[propertyInfo.Name], null);
  31. }
  32.  
  33. return MapMessage;
  34. }
  35.  
  36. public static T GetMapMessageByIMapMessage<T>(IMapMessage mapMessage, T MapMessage)
  37. {
  38. if (mapMessage == null || object.Equals(MapMessage, null))
  39. {
  40. return default(T);
  41. }
  42.  
  43. foreach (var propertyInfo in MapMessage.GetType().GetProperties())
  44. {
  45. propertyInfo.SetValue(MapMessage, mapMessage.Body[propertyInfo.Name.ToUpper()], null);
  46. }
  47.  
  48. return MapMessage;
  49. }
  50. }

重点是跨站点和跨服务器传输的时候,需要通过Message的Body去设置传输参数

ActiveMQ 复杂类型的发布与订阅的更多相关文章

  1. windows安装ActiveMQ以及点对点以及发布订阅

    一.MQ产品的分类 1.RabbitMQ 是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级 ...

  2. (转)SqlServer 数据库同步的两种方式 (发布、订阅),主从数据库之间的同步

    最近在琢磨主从数据库之间的同步,公司正好也需要,在园子里找了一下,看到这篇博文比较详细,比较简单,本人亲自按步骤来过,现在分享给大家. 在这里要提醒大家的是(为了更好的理解,以下是本人自己理解,如有错 ...

  3. 知方可补不足~SQL2008中的发布与订阅模式

    回到目录 作用:完成数据库与数据库的数据同步 原理:源数据库发布需要同时的表,存储过程,或者函数:目标数据库去订阅它,当源发生变化时,目标数据库自己同步,注意,由于这个过程是SQL自动完成的,所以要求 ...

  4. RabbitMQ官方中文入门教程(PHP版) 第三部分:发布/订阅(Publish/Subscribe)

    发布/订阅 在上篇教程中,我们搭建了一个工作队列.每个任务之分发给一个工作者(worker).在本篇教程中,我们要做的之前完全不一样——分发一个消息给多个消费者(consumers).这种模式被称为“ ...

  5. SQL2005删除复制数据库的发布与订阅的方法(转载)

    SQL2005删除复制数据库的发布与订阅的方法 --在测试环境中恢复从正式数据库服务器 上备份下来的bak文件后,正式环境里数据库复制的发布.订阅也被带进来了,结果恢复的数据库无法更改表结构,直接删除 ...

  6. SQL SERVER发布与订阅 [原创]

    一.配置分发 1.配置分发服务器,注:配置发布与订阅,连接SQLSERVER必须用服务器名登录 2.配置分发 3.选择分发服务器 4.选择快照文件夹 5.设置此文件夹的读写权限为everyone 6. ...

  7. 转载RabbitMQ入门(3)--发布和订阅

    发布和订阅 (使用java 客户端) 在先前的指南中,我们创建了一个工作队列.这工作队列后面的假想是每一个任务都被准确的传递给工作者.在这部分我们将会做一些完全不同的事情–我们将一个消息传递给多个消费 ...

  8. (转)SqlServer2008 数据库同步的两种方式 (发布、订阅)

    上篇中说了通过SQL JOB的方式对数据库的同步,这一节作为上一节的延续介绍通过发布订阅的方式实现数据库之间的同步操作.发布订阅份为两个步骤:1.发布.2订阅.首先在数据源数据库服务器上对需要同步的数 ...

  9. 文成小盆友python-num12 Redis发布与订阅补充,python操作rabbitMQ

    本篇主要内容: redis发布与订阅补充 python操作rabbitMQ 一,redis 发布与订阅补充 如下一个简单的监控模型,通过这个模式所有的收听者都能收听到一份数据. 用代码来实现一个red ...

随机推荐

  1. 【小白学游戏常用算法】二、A*启发式搜索算法

    在上一篇博客中,我们一起学习了随机迷宫算法,在本篇博客中,我们将一起了解一下寻路算法中常用的A*算法. 通常情况下,迷宫寻路算法可以使用深度优先或者广度优先算法,但是由于效率的原因,不会直接使用这些算 ...

  2. 我觉得好用的VS扩展(不定期更新)

    首先向这些扩展的创作者致敬 这里都是2013版的  有些在给出的连接里有该扩展支持的其他版本连接 当然你也可以通过 VS->工具->扩展和更新->在线->搜索扩展名 来找到它们 ...

  3. ZeroMQ接口函数之 :zmq_msg_move - 将一个消息里面的内容移动到另一个消息里面

    ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq_msg_move zmq_msg_move(3)   ØMQ Manual - ØMQ/3.2.5 Name zm ...

  4. redis配置主从备份以及主备切换方案配置

    前提:redis中,主从切换场景中,没有绝对的主和从,只有初始化的主和从,然后当主down后,从就变成主了,而主即使连接上,也是从,不会变为主 1.redis-server的主备关系: 需要配置的机器 ...

  5. 使用JQuery UI selectmenu, onchange事件失效

    今天, 在用jQuery UI的一套东西是发现<select class="dropmenu" onchange="do();"></sele ...

  6. Learn ZYNQ (8)

    在zed的PS端运行spark(已成功): (1)设置uboot为sd卡启动rootfs: "sdboot=if mmcinfo; then " \                 ...

  7. Tomcat启动后,从spring容器中获取Bean和ServletContext

    public static Object getBean(String beanName){ ApplicationContext context = ContextLoader.getCurrent ...

  8. 重置dns

    flusdns

  9. C++STL -- vector实现

    STL的vector简化实现 本质 vector说到底就是一个动态数组,我们需要做的就是管理动态数组的内存,和元素的增加,删除,移动等. template <typename T> cla ...

  10. 如何提高Java并行程序性能??

    在Java程序中,多线程几乎已经无处不在.与单线程相比,多线程程序的设计和实现略微困难,但通过多线程,我们却可以获得多核CPU带来的性能飞跃,从这个角度说,多线程是一种值得尝试的技术.那么如何写出高效 ...