一、ActiviteMQ接收和发送消息基本流程
流程图和操作步骤转自《ActiveMQ 即时通讯服务 浅析》。
发送消息的基本步骤:
(1)、创建连接使用的工厂类JMS ConnectionFactory
(2)、使用管理对象JMS ConnectionFactory建立连接Connection,并启动
(3)、使用连接Connection 建立会话Session
(4)、使用会话Session和管理对象Destination创建消息生产者MessageSender
(5)、使用消息生产者MessageSender发送消息
消息接收者从JMS接受消息的步骤
(1)、创建连接使用的工厂类JMS ConnectionFactory
(2)、使用管理对象JMS ConnectionFactory建立连接Connection,并启动
(3)、使用连接Connection 建立会话Session
(4)、使用会话Session和管理对象Destination创建消息接收者MessageReceiver
(5)、使用消息接收者MessageReceiver接受消息,需要用setMessageListener将MessageListener接口绑定到MessageReceiver消息接收者必须实现了MessageListener接口,需要定义onMessage事件方法。
二、使用C#连接ActiveMQ
1、从官方网站下载最新版的Apache.NMS:http://activemq.apache.org/nms/download.html,需要下载Apache.NMS和Apache.NMS.ActiveMQ。
2、创建C#控制台项目,引入Apache.NMS.dll和Apache.NMS.ActiveMQ.dll。
3、发送消息代码
class Program
{
static void Main(string[] args)
{
try
{
string queuesNameESF = "queue://test.log";
Uri uri = new Uri("activemq:tcp://localhost:61616");
IConnectionFactory factory = new ConnectionFactory(uri);
using (IConnection conn = factory.CreateConnection("system", "manager"))
{
using (ISession session = conn.CreateSession())
{
IDestination destination = SessionUtil.GetDestination(session, queuesNameESF);
using (IMessageProducer producer = session.CreateProducer(destination))
{
conn.Start();
ITextMessage request = session.CreateTextMessage("Test sender message.");
producer.Send(request);
Console.WriteLine("Send message success.");
}
}
}
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
4、接收消息代码
class Program
{
static void Main(string[] args)
{
try
{
string queuesNameESF = "queue://test.log";
Uri uri = new Uri("activemq:tcp://localhost:61616?wireFormat.maxInactivityDuration=0");
IConnectionFactory factory = new ConnectionFactory(uri);
using (IConnection conn = factory.CreateConnection("system", "manager"))
{
using (ISession session = conn.CreateSession())
{
conn.Start();
IDestination destination = SessionUtil.GetDestination(session, queuesNameESF);
using (IMessageConsumer consumer = session.CreateConsumer(destination))
{
int msgCount = 0;
ITextMessage message = consumer.Receive(new TimeSpan(0, 0, 0, 0, 10)) as ITextMessage;
while (message != null)
{
Console.WriteLine("Receive message: " + message.Text);
msgCount++;
message = consumer.ReceiveNoWait() as ITextMessage;
}
Console.WriteLine("Receive message count: " + msgCount);
}
}
}
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
5、注意事项
(1)在conf/activemq.xml文件中可以找到ActiveMQ的连接属性(参考配置ActiveMQ的Transport Connectors):
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
(2)在conf/credentials.properties文件中可以找到连接的用户名、密码:
activemq.username=system
activemq.password=manager
guest.password=password