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秒发送一次消息:
这里写图片描述
消费者:

    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);  
        }  
    }

启动一个消费者:
这里写图片描述
我们发现他是从15开始的,而不是像上节一样从头开始,再启动另一个消费者:
这里写图片描述
我们发现就是从启动时开始接受消息的,之前的消息就丢失了。
整体状态如下:
这里写图片描述

我们观察管理界面:
这里写图片描述
产生了一个testing的Topics,而订阅方有2个都订阅的是testing:
这里写图片描述
这样只需要在需要获取消息的地方订阅即可及时获得。

转自:http://www.cnblogs.com/madyina/p/4127144.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值