activemq之调用问题研究

mac2022-06-30  36

既然决定使用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方式,可以做消息队列的处理,方便做管理

 

 

最新回复(0)