MSMQ?不,太弱了。使用ActiveMQ实现消息队列服务


关于MSMQ和ActiveMQ的基础功能就不再描述。这里说说ActiveMQ的比较实用的一个功能:ScheduledMessage

ScheduledMessage可以理解为一个调度功能,可以延时、重复发送消息。我就是采用这种方案来实现Web中的定时功能和系统中不同模块之间的消息传递。

这里主要说一下延时消息的新增、删除操作(坑啊官方API里面貌似没有这一个功能的描述,只有一全案例,而案例上所用到的东西,在NuGet上下载的dll根本没有这一个类)。


要使用Scheduled功能需要在服务端conf/activemq.xml中把Scheduled打开,根据官网上的提示,是需要在broker上面添加一个schedulerSupport="true"属性,配置好后,重启服务。

 <!--
        The <broker> element is used to configure the ActiveMQ broker.
    -->
    <broker schedulerSupport="true" xmlns="http://activemq.apache.org/schema/core" 




延时消息发送:

                IConnectionFactory factory = new ConnectionFactory("tcp://192.168.1.248:61616/");
                using (IConnection connection = factory.CreateConnection())
                {
                    using (ISession session = connection.CreateSession())
                    {
                        IMessageProducer prod = session.CreateProducer(
                            new Apache.NMS.ActiveMQ.Commands.ActiveMQTopic("testing"));

                        ITextMessage msg = prod.CreateTextMessage();
                        msg.Text = "这是一个延时消息";
                        msg.Properties.SetLong("AMQ_SCHEDULED_DELAY", 3600000); //这里设置一个延时发送,后面是延时单位是ms,
                        prod.Send(msg);
                        Console.WriteLine(msg.NMSMessageId);//发送成功后,NMSMessageId将会被赋值,如果需要删除单条消息需要把这个记录下来

                    }
                }
发送成功后,在服务器上可以看到这个延时消息




删除这个延时消息:

 IConnectionFactory factory = new ConnectionFactory("tcp://192.168.1.248:61616/");
            using (IConnection connection = factory.CreateConnection())
            {
                using (ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
                {
                    IDestination management = session.GetDestination("ActiveMQ.Scheduler.Management");
                    connection.Start();
                    IMessageProducer producer = session.CreateProducer(management);
                    IMessage request = session.CreateMessage();

                    request.Properties.SetString("AMQ_SCHEDULER_ACTION", "REMOVE");//指定当前消息是来删除某个延时消息
                    request.Properties.SetString("scheduledJobId", id);//指定要删除的延时消息的ID、这个ID就是刚刚发送成功时返回的ID
                    producer.Send(request);

                }
            }



参考资料

http://www.programcreek.com/java-api-examples/index.php?api=javax.jms.MessageListener


http://activemq.apache.org/maven/apidocs/src-html/org/apache/activemq/ScheduledMessage.html#line.64

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值