消息处理代码

 

消息处理封装的代码:

public class Transceiver
{
public IPAddress MQServerIP { get; set; }
public UInt16 MQServerPort { get; set; }
public String MQUserName { get; set; }
public String MQPassword { get; set; }
public String MQTopic { get; set; }
public Boolean IsOnline { get { return Online; } }
/// <summary>
/// 消息持久时间(秒)
/// </summary>
public Int32 TTL { get; set; }

private IConnectionFactory factory;
private IConnection connection;
private ISession session;
private IMessageProducer producer;
private IMessageConsumer consumer;
private Boolean Online;

public delegate void MessageReceiveHandle(MQMessage massage);
public event MessageReceiveHandle MessageReceived;
public delegate void ConnectionEventHandle(Boolean Online);
public event ConnectionEventHandle ConnectionEvent;
public delegate void ConnectionErrorHandle(Exception error);
public event ConnectionErrorHandle ConnectionError;

public Transceiver(IPAddress ServerIP, UInt16 ServerPort, String UserName, String Password, String Topic, Int32 ttl)
{
MQServerIP = ServerIP;
MQServerPort = ServerPort;
MQUserName = UserName;
MQPassword = Password;
MQTopic = Topic;
TTL = ttl;

producer = null;
factory = null;
connection = null;
session = null;
Online = false;
}

~Transceiver()
{
Close();
}

public Boolean Open()
{
if (IsOnline) { return IsOnline; }
try
{
String URI = String.Format("tcp://{0}:{1}", MQServerIP, MQServerPort);
factory = new ConnectionFactory(URI);
if (MQUserName != "")
{
connection = factory.CreateConnection(MQUserName, MQPassword);
}
else
{
connection = factory.CreateConnection();
}
connection.ConnectionInterruptedListener += connection_ConnectionInterruptedListener;
connection.ConnectionResumedListener += connection_ConnectionResumedListener;
connection.ExceptionListener += connection_ExceptionListener;
connection.Start();
session = connection.CreateSession();
//CreateProducer
producer = session.CreateProducer(new Apache.NMS.ActiveMQ.Commands.ActiveMQTopic(MQTopic));
//CreateConsumer
consumer = session.CreateConsumer(new Apache.NMS.ActiveMQ.Commands.ActiveMQTopic(MQTopic));
//Regist event
consumer.Listener += consumer_Listener;
Online = true;
}
catch
{
Online = false;
}
return Online;
}

void connection_ExceptionListener(Exception exception)
{
ConnectionError(exception);
Close();
Thread thread = new Thread(new ThreadStart(ResumConncet));
thread.IsBackground = true;
thread.Start();
}

private void ResumConncet()
{
while (!IsOnline)
{
String URI = String.Format("tcp://{0}:{1}", MQServerIP, MQServerPort);
factory = new ConnectionFactory(URI);
try
{
if (MQUserName != "")
{
connection = factory.CreateConnection(MQUserName, MQPassword);
}
else
{
connection = factory.CreateConnection();
}
connection.ConnectionInterruptedListener += connection_ConnectionInterruptedListener;
connection.ConnectionResumedListener += connection_ConnectionResumedListener;
connection.ExceptionListener += connection_ExceptionListener;
connection.Start();
Online = true;
ConnectionEvent(Online);
session = connection.CreateSession();
//CreateProducer
producer = session.CreateProducer(new Apache.NMS.ActiveMQ.Commands.ActiveMQTopic(MQTopic));
//CreateConsumer
consumer = session.CreateConsumer(new Apache.NMS.ActiveMQ.Commands.ActiveMQTopic(MQTopic));
//Regist event
consumer.Listener += consumer_Listener;
}
catch { }
}
}

void connection_ConnectionResumedListener()
{
Online = true;
ConnectionEvent(Online);
}

void connection_ConnectionInterruptedListener()
{
Online = false;
ConnectionEvent(Online);
}

void consumer_Listener(IMessage message)
{
IObjectMessage objmsg = (IObjectMessage)message;
MQMessage msg = (MQMessage)objmsg.Body;
MessageReceived(msg);
}

public void Close()
{
if (producer != null)
{
try
{
producer.Close();
producer.Dispose();
}
catch { }
}
if (consumer != null)
{
try
{
consumer.Close();
consumer.Dispose();
}
catch { }
}
if (session != null)
{
try
{
session.Close();
session.Dispose();
}
catch { }
}
if (connection != null)
{
try
{
connection.Stop();
connection.Close();
connection.Dispose();
}
catch { }
}
Online = false;
}

public void SendMessage(MQMessage massage)
{
IObjectMessage msg = producer.CreateObjectMessage(massage);
producer.Send(msg, Apache.NMS.MsgDeliveryMode.Persistent, Apache.NMS.MsgPriority.Normal, TimeSpan.FromSeconds(TTL));
}
}

posted on   荣锋亮  阅读(624)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示