ActiveMQ发布订阅模式

Posted 星火卓越

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ActiveMQ发布订阅模式相关的知识,希望对你有一定的参考价值。

ActiveMQ的另一种模式就SUB/HUB即发布订阅模式,是SUB/hub就是一拖N的USB分线器的意思。意思就是一个来源分到N个出口。还是上节的例子,当一个订单产生后,后台N个系统需要联动,但有一个前提是都需要收到订单信息,那么我们就需要将一个生产者的消息发布到N个消费者。

生产者:

 

复制代码
            try
            {
                //Create the Connection Factory  
                IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616/");
                using (IConnection connection = factory.CreateConnection())
                {
                    //Create the Session  
                    using (ISession session = connection.CreateSession())
                    {
                        //Create the Producer for the topic/queue  
                        IMessageProducer prod = session.CreateProducer(
                            new Apache.NMS.ActiveMQ.Commands.ActiveMQTopic("testing"));

                        //Send Messages  
                        int i = 0;

                        while (!Console.KeyAvailable)
                        {
                            ITextMessage msg = prod.CreateTextMessage();
                            msg.Text = i.ToString();
                            Console.WriteLine("Sending: " + i.ToString());
                            prod.Send(msg, Apache.NMS.MsgDeliveryMode.NonPersistent, Apache.NMS.MsgPriority.Normal, TimeSpan.MinValue);

                            System.Threading.Thread.Sleep(5000);
                            i++;
                        }
                    }
                }

                Console.ReadLine();
            }
            catch (System.Exception e)
            {
                Console.WriteLine("{0}", e.Message);
                Console.ReadLine();
            }
复制代码

假设生产者每5秒发送一次消息:

wps3E59.tmp

消费者:

复制代码
        static void Main(string[] args)
        {
            try  
            {  
                //Create the Connection factory  
                IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616/");  
                  
                //Create the connection  
                using (IConnection connection = factory.CreateConnection())  
                {  
                    connection.ClientId = "testing listener1";  
                    connection.Start();  
  
                    //Create the Session  
                    using (ISession session = connection.CreateSession())  
                    {  
                        //Create the Consumer  
                        IMessageConsumer consumer = session.CreateDurableConsumer(new Apache.NMS.ActiveMQ.Commands.ActiveMQTopic("testing"), "testing listener1", null, false);  
                          
                        consumer.Listener += new MessageListener(consumer_Listener);  
  
                        Console.ReadLine();  
                    }  
                    connection.Stop();  
                    connection.Close();  
                }  
            }  
            catch (System.Exception e)  
            {  
                Console.WriteLine(e.Message);  
            }  
        }  
  
        static void consumer_Listener(IMessage message)  
        {  
            try  
            {  
                ITextMessage msg = (ITextMessage)message;  
                Console.WriteLine("Receive: " + msg.Text);  
           }  
            catch (System.Exception e)  
            {  
                Console.WriteLine(e.Message);  
            }  
        }
复制代码

 

启动一个消费者:

wps3E5A.tmp

我们发现他是从15开始的,而不是像上节一样从头开始,再启动另一个消费者:

wps3E5B.tmp

我们发现就是从启动时开始接受消息的,之前的消息就丢失了。

整体状态如下:

wps3E6B.tmp

我们观察管理界面:

wps3E6C.tmp

产生了一个testing的Topics,而订阅方有2个都订阅的是testing:

wps3E6D.tmp

这样只需要在需要获取消息的地方订阅即可及时获得。

源代码下载

以上是关于ActiveMQ发布订阅模式的主要内容,如果未能解决你的问题,请参考以下文章

ActiveMQ消息队列的使用及应用

ActiveMQ消息队列的使用及应用

ActiveMQ消息队列的使用及应用

ActiveMQ Topic模式下怎么在发布端指定部分订阅者接收消息

ActiveMQ发布订阅模式

JMS消息队列ActiveMQ(发布/订阅模式)