C#中关于ActiveMQ的应用详解

一、ActiveMQ基础知识

ActiveMQ是Apache出品的开源消息中间件,它实现了JMS(Java Message Service)规范,是目前最流行的消息中间件之一。ActiveMQ作为一种面向消息的中间件,它的基本功能是实现应用之间的异步、松耦合、高效、可靠的通信。使用ActiveMQ可以很大程度上降低系统间的耦合度,提高系统的可扩展性、灵活性以及可维护性。

下面我们来看一下ActiveMQ的基本概念:

1.生产者与消费者

在ActiveMQ中,消息的发送者被称为“生产者”,而消息的接收方被称作“消费者”。

//生产者代码

ConnectionFactory connectionFactory = new ConnectionFactory("tcp://localhost:61616");

Connection connection = connectionFactory.CreateConnection();

ISession session = connection.CreateSession();

IDestination destination = session.GetQueue("test-queue");

IMessageProducer producer = session.CreateProducer(destination);

ITextMessage msg = session.CreateTextMessage();

msg.Text = "Hello ActiveMQ";

producer.Send(msg);

Console.WriteLine("Message sent");

//消费者代码

ConnectionFactory connectionFactory = new ConnectionFactory("tcp://localhost:61616");

Connection connection = connectionFactory.CreateConnection();

ISession session = connection.CreateSession();

IDestination destination = session.GetQueue("test-queue");

IMessageConsumer consumer = session.CreateConsumer(destination);

connection.Start();

IMessage message = consumer.Receive();

if (message is ITextMessage)

{

ITextMessage textMessage = (ITextMessage)message;

Console.WriteLine("Received message: " + textMessage.Text);

}

connection.Close();

2.队列与主题

在ActiveMQ中,消息传递主要有两种方式:点对点(Queue)和发布订阅(Topic)。点对点方式下,消息发送者发送消息到指定的队列,消息接收者从队列中取走消息,消息被消费后就会从队列中删除。而发布订阅方式下,消息发送者将消息发送到指定的主题(Topic),多个消息接收者可以订阅该主题,每个订阅者都能收到消息,接收者之间互不影响。

3.持久化和非持久化

在ActiveMQ中,默认情况下,消息都是非持久化的。也就是说,如果ActiveMQ在消息发送后宕机,那么该消息将会被丢失。而如果将消息设置成持久化的,即使ActiveMQ宕机后,如果宕机前消息已经被保存到磁盘上了,那么在ActiveMQ重新启动时,仍然能够保证消息不会丢失。

上面我们介绍了ActiveMQ的基本概念,下面我们来看一下C#中如何使用ActiveMQ。

二、C#中使用ActiveMQ

1.ActiveMQ的安装与配置

C#中使用ActiveMQ,需要先安装ActiveMQ服务端。下载地址为:http://activemq.apache.org/download.html。安装完之后,在${ACTIVEMQ_HOME}/conf目录下找到activemq.xml文件,并将其中的transportConnector标签修改成以下内容:

修改完activemq.xml文件保存即可。

2.引入ActiveMQ相关DLL文件

在C#项目中使用ActiveMQ,需要添加以下三个DLL文件:

Apache.NMS.dll

Apache.NMS.ActiveMQ.dll

log4net.dll

3.发送与接收消息

在C#中使用ActiveMQ,首先需要创建ConnectionFactory对象,然后根据该对象创建Connection对象,再根据Connection对象创建Session对象,最后根据Session对象和Destination对象创建Producer或Consumer对象。

使用C#发送消息示例:

ConnectionFactory connectionFactory = new ConnectionFactory("tcp://localhost:61616");

using (IConnection connection = connectionFactory.CreateConnection())

{

using (ISession session = connection.CreateSession())

{

IDestination destination = session.CreateQueue("test-queue");

using (IMessageProducer producer = session.CreateProducer(destination))

{

producer.DeliveryMode = MsgDeliveryMode.Persistent;

ITextMessage message = session.CreateTextMessage("Hello ActiveMQ");

producer.Send(message);

Console.WriteLine("Message sent");

}

}

}

使用C#接收消息示例:

ConnectionFactory connectionFactory = new ConnectionFactory("tcp://localhost:61616");

using (IConnection connection = connectionFactory.CreateConnection())

{

using (ISession session = connection.CreateSession())

{

IDestination destination = session.CreateQueue("test-queue");

using (IMessageConsumer consumer = session.CreateConsumer(destination))

{

connection.Start();

IMessage message = consumer.Receive();

if (message is ITextMessage)

{

ITextMessage textMessage = (ITextMessage)message;

Console.WriteLine("Received message: " + textMessage.Text);

}

connection.Close();

}

}

}

C#中可以发送和接收多种类型的消息,例如:TextMessage、ObjectMessage、BytesMessage等。

三、ActiveMQ与Spring的集成

在Java开发中各种框架与ActiveMQ的集成已经非常成熟,而在C#中,由于ActiveMQ的API与Java版本的API并不完全一致,因此要实现完美的集成还是相对较为困难的。不过,在使用Spring框架搭建C#应用的情况下,可以通过Spring提供的消息组件集成ActiveMQ,以便更加方便地使用ActiveMQ进行消息发送和接收。

Spring提供了两种集成ActiveMQ的方式:

1.使用Apache.NMS.ActiveMQ.Spring命名空间

Apache.NMS.ActiveMQ.Spring是一个Spring.NET为ActiveMQ提供的组件库,通过它可以很方便地创建ActiveMQ的连接、消息生产者和消息消费者等对象。相关DLL文件:

Apache.NMS.ActiveMQ.dll

Spring.Core.dll

Spring.Messaging.dll

Spring.Messaging.Nms.dll

使用该命名空间可以轻松实现生产者和消费者的创建和使用,而不必像在C#原生API中一样手动创建Connection、Session、Producer、Consumer等对象。示例代码如下:

//创建连接

var factory = new ConnectionFactory("tcp://localhost:61616");

var connection = factory.CreateConnection();

connection.Start();

//创建消息生产者

var context = new GenericApplicationContext();

var connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");

var template = new NmsTemplate(connectionFactory);

context.ObjectFactory.RegisterSingleton("template", template);

var producer = context.ObjectFactory.GetObject("myProducer");

//创建消息消费者

var consumer = context.ObjectFactory.GetObject("myConsumer");

//发送消息

var message = template.ConvertMessage("hello world");

producer.Send(message);

//接收消息

var receivedMessage = consumer.Receive(TimeSpan.FromSeconds(1));

if (receivedMessage != null)

{

var textMessage = receivedMessage as ITextMessage;

Console.WriteLine(textMessage.Text);

}

2.使用Apache.NMS和Spring依赖注入

除了使用Apache.NMS.ActiveMQ.Spring命名空间外,还可以使用Apache.NMS和Spring依赖注入来集成ActiveMQ。这种集成方式需要在App.config文件中配置Spring对象。配置完成后,可以使用IApplicationContext接口获得消息连接、消息生产者和消息消费者等对象。相关DLL文件:

Apache.NMS.dll

Spring.Core.dll

Spring.Messaging.dll

Spring.Messaging.Nms.dll

需要在App.config文件中添加以下配置:

Apache.NMS.ITextMessage

System.String

false

Spring的配置文件中,可以配置多个对象,直接引用ID即可。其中,MyListener为消息监听器,需要实现IMessageListener接口。

public class MyListener : IMessageListener

{

public void OnMessage(IMessage message)

{

ITextMessage textMessage = message as ITextMessage;

Console.WriteLine(textMessage.Text);

}

public ISomeDependency SomeDependency { get; set; }

}

四、总结

本文介绍了ActiveMQ的基础知识、C#中如何使用ActiveMQ以及ActiveMQ与Spring的集成方式。ActiveMQ是一种非常流行的消息中间件,可以用于实现应用之间的异步、松耦合、高效、可靠的通信。在C#中使用ActiveMQ需要引入相关DLL文件,并手动创建Connection、Session、Producer和Consumer等对象。在使用Spring框架搭建C#应用时,可以使用Spring提供的消息组件集成ActiveMQ,以便更加方便地使用ActiveMQ进行消息发送和接收。

后端开发标签