一、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文件中添加以下配置:
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进行消息发送和接收。