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

原创 2015年02月04日 13:49:31


关于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

相关文章推荐

WCF 结合MSMQ,使服务更稳定

转载自:http://blog.csdn.net/hoken2020856/article/details/5622860 WCF(Windows Communication Foundation)...

MSMQ 消息队列、监听MSMQ消息、消息扫描

namespace FSMP.PTS.MSMQ { public class MSMQHelper     {         ///          /// MSMQ服务地址配置       ...

多线程消息队列 (MSMQ) 触发器

 要:本文论述了各种模式的线程(单线程、单元线程和自由线程)以及每种模式的使用方法。同时,还提供了一个使用线程的 C# 语言代码示例,以帮助您编写使用线程的应用程序。本文还讨论了多线程代码中的一些重要...

.Net下的MSMQ(微软消息队列)的同步异步调用

http://www.cnblogs.com/goody9807/archive/2007/05/18/546572.html 一、MSMQ简介  MSMQ(微软消息队列)是Windo...

【消息队列MQ】各类MQ比较

目前业界有很多MQ产品,我们作如下对比: RabbitMQ 是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常...

ActiveMQ消息特性:延迟和定时消息投递(Delay and Schedule Message Delivery)

有时候我们不希望消息马上被broker投递出去,而是想要消息60秒以后发给消费者,或者我们想让消息没隔一定时间投递一次,一共投递指定的次数。。。 类似这种需求,ActiveMQ提供了一种broker...
  • KimmKing
  • KimmKing
  • 2012年12月27日 15:37
  • 21878

消息队列MSMQ的使用实例

  消息队列:是在消息传输过程中保存消息的容器。MSMQ是Microsoft的消息处理技术,运行平台为Microsoft Windows操作系统。它分为用户队列和系统队列。在用户队列中又分为专用队列:...

深入浅出 消息队列 ActiveMQ

一、 概述与介绍 ActiveMQ 是Apache出品,最流行的、功能强大的即时通讯和集成模式的开源服务器。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Prov...
  • jwdstef
  • jwdstef
  • 2013年12月17日 17:25
  • 59006

java消息队列ActiveMQ的简单使用

activeMQ 是学习java消息队列的实现项目,使用jfinal + jfinal-ext + activeMQ + quartz快速构建。 1.消息队列 消息队列,其实是一种基于数据结构实现的...
  • shine4j
  • shine4j
  • 2016年08月03日 14:39
  • 1720

简单实现Java消息队列之activemq

Hi ,大家好 最近在学习JMS(Java Message Service),用到的是activemq(消息队列),写了简单的例子,跟大家一起分享一下: 1.JMS和activemq之间的关系 :  ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MSMQ?不,太弱了。使用ActiveMQ实现消息队列服务
举报原因:
原因补充:

(最多只允许输入30个字)