既然决定使用activemq,那么就需要对他有所了解。
现在先提出如下疑惑:
1,如果acvtiemq 宕机了,我的客户端程序是否还需要重启?再发送数据,会有什么异常?
using Apache.NMS; using Apache.NMS.ActiveMQ; using Apache.NMS.Util; using System; namespace ActiveMqProducer { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); String QueuesNameESF = "queue://test.log"; Uri _uri = new Uri(String.Concat("activemq:tcp://192.168.227.1:61616")); IConnectionFactory factory = new ConnectionFactory(_uri); IConnection conn = factory.CreateConnection("admin", "manager"); ISession session = conn.CreateSession(); IDestination destination = SessionUtil.GetDestination(session, QueuesNameESF); IMessageProducer producer = session.CreateProducer(destination); conn.Start(); //可以写入字符串,也可以是一个xml字符串等 ITextMessage request = session.CreateTextMessage("messsage"); producer.Send(request); Console.ReadKey(); try { producer.Send(request); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); try { producer.Send(request); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); } } }重新activemq服务之后,再次点击发送,发现出错了;
分析一下各个过程对应的tcp的交互流程
这个过程,用来建立tcp连接的,截图如下:
IConnection conn = factory.CreateConnection("admin", "manager");下面的步骤会又进行一些列的交互如下:通过查看,可以发现心跳也在这里面
ISession session = conn.CreateSession();下面的函数,其实没有tcp的交互
IDestination destination = SessionUtil.GetDestination(session, QueuesNameESF);下面的创建生产者,也会产生tcp的交互
IMessageProducer producer = session.CreateProducer(destination);
发送消息的截图如下:
conn.Start(); //可以写入字符串,也可以是一个xml字符串等 ITextMessage request = session.CreateTextMessage("messsage"); producer.Send(request);
简单的总结一下客户端与服务端的交互过程:
*********************************************摸索出来,据说很多功能可以在url里面设置***************
1,设置url为failover:(tcp://192.168.227.1:61616)之后,会自动重连
但是,遇到一个问题:当服务不在线的时候,会一直柱塞在这里
ISession session = conn.CreateSession();
当服务不在线的时候,
producer.Send(request);
也会一直阻塞,直到服务重启开启,可以发送数据。
这个不是我想看到的,所以断线重连,我想放在应用层里面做。如果换成activemq:tcp://192.168.227.1:61616这种模式的时候
发送不会堵住,而是直接抛出一个异常,这样就便于我在应用层进行控制了。
现在还存在一个问题,我想进行异步发送,但是C#里面,一直没有找到合适的方法进行异步发送?难道C#的客户端不支持异步的方式么?
***************************************activemq的同步与异步解析**************************
activemq的同步:会有个应答发送回来,异步的也会收到应答回来,但是,C#的客户端没有提供异步的模式,暂时只能同步进行。
下面的属于oneway模式,就直接发送消息,不管是否有应答
截图如下:
************************消息持久化******************
默认的消息是支持持久化的,就是没有消费,会保存起来,但是我不需要这种模式,所以就设置不需要持久化
IMessageProducer producer = session.CreateProducer(destination); producer.RequestTimeout = new TimeSpan(0, 0, 3); producer.DeliveryMode = MsgDeliveryMode.NonPersistent;设置一个消息3秒超时,设置消息非持久化。
*************************************activemq未开启*******************
现在遇到一个问题,当activemq未开启的时候,会一直卡在那里,无法进入下一个环节。
再次经过尝试,下面这个函数会抛出异常。
conn = factory.CreateConnection("admin", "manager");基本上研究差不多了,后面开始封装一个activemq的生产库,来实现activemq的消息处理。需要考虑一下问题:
1,不使用OneWay的处理方式,因为我的信令并发不多
2,不使用内部的消息重连方式,即使用failover方式,使用activemq,不让他内部进行重连
3,使用微软的ActionBlock方式,可以做消息队列的处理,方便做管理