阿里云消息队列的实践应用

原创 2016年08月30日 16:45:44

  阿里推出了阿里云消息队列服务(https://www.aliyun.com/product/ons/),出于好奇,简单的尝试了一下它的功能及使用:


  消息队列首先需要有它的主题Topic,生产者producer,消费者consumer。其中主题与生产者的对应关系为N:1,主题与消费者的对应关系为N:N。依次创建三者:


 






  最后还需要accessKey,设置为:



 (具体在哪里设置请详细参考阿里云消息队列的官方文档)


 接下来就可以搭建自己的项目了。

 pom.xml文件为:


<dependencies>  
    <dependency>  
        <groupId>com.aliyun.openservices</groupId>  
        <artifactId>ons-client</artifactId>  
        <version>1.2.2</version>  
    </dependency>  
    <dependency>  
        <groupId>org.springframework</groupId>  
        <artifactId>spring-context</artifactId>  
        <version>4.2.6.RELEASE</version>  
    </dependency>  
</dependencies>

    生产者与消费者的配置文件:


<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
    <bean id="producer" class="com.aliyun.openservices.ons.api.bean.ProducerBean" init-method="start" destroy-method="shutdown">  
        <property name="properties" > <!--生产者配置信息-->  
            <props>  
                <prop key="ProducerId">xxx</prop> <!--请替换XXX-->  
                <prop key="AccessKey">xxx</prop>  
                <prop key="SecretKey">xxx</prop>  
            </props>  
        </property>  
    </bean>  
</beans>

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
    <bean id="msgListener" class="com.wzj.messagequeue.MessageListener"></bean> <!--Listener配置-->  
    <bean id="consumer" class="com.aliyun.openservices.ons.api.bean.ConsumerBean" init-method="start" destroy-method="shutdown">  
        <property name="properties" > <!--消费者配置信息-->  
            <props>  
                <prop key="ConsumerId">xxx</prop> <!--请替换XXX-->  
                <prop key="AccessKey">xxx</prop>  
                <prop key="SecretKey">xxx</prop>  
                <!--将消费者线程数固定为50个.-->  
                <prop key="ConsumeThreadNums">10</prop>  
            </props>  
        </property>  
        <property name="subscriptionTable">  
            <map>  
                <entry value-ref="msgListener">  
                    <key>  
                        <bean class="com.aliyun.openservices.ons.api.bean.Subscription">  
                            <property name="topic" value="Topic_Test_MQFunction"/>  
                            <property name="expression" value="*"/>  
                        </bean>  
                    </key>  
                </entry>  
                <!--更多的订阅添加entry节点即可-->  
            </map>  
        </property>  
    </bean>  
</beans>

    之后ProductWithSpring则是消息的发出者实现:

 

public class ProduceWithSpring {  
  
    public static void main(String[] args) {  
        /** 
         * 生产者Bean配置在producer.xml中,可通过ApplicationContext获取或者直接注入到其他类(比如具体的Controller)中. 
         */  
        ApplicationContext context = new ClassPathXmlApplicationContext("producer.xml");  
        Producer producer = (Producer) context.getBean("producer");  
        //循环发送消息  
        for (int i = 0; i < 10; i++) {  
            Message msg = new Message( //  
                    // Message Topic  
                    "Topic_Test_MQFunction",  
                    // Message Tag 可理解为Gmail中的标签,对消息进行再归类,方便Consumer指定过滤条件在MQ服务器过滤  
                    "",  
                    // Message Body 可以是任何二进制形式的数据, MQ不做任何干预  
                    // 需要Producer与Consumer协商好一致的序列化和反序列化方式  
                    "Hello MQ".getBytes());  
            // 设置代表消息的业务关键属性,请尽可能全局唯一  
            // 以方便您在无法正常收到消息情况下,可通过MQ 控制台查询消息并补发  
            // 注意:不设置也不会影响消息正常收发  
            msg.setKey("Topic_Test_MQFunction_key");  
            // 发送消息,只要不抛异常就是成功  
            try {  
                SendResult sendResult = producer.send(msg);  
                assert sendResult != null;  
                System.out.println("send success: " + sendResult.getMessageId());  
            }catch (ONSClientException e) {  
  
                System.out.println("发送失败");  
            }  
        }  
    }  
  
}

     消费者接受的实现类ConsumeWithSpring:


public class ConsumeWithSpring {  
  
    public static void main(String[] args) {  
        /** 
         * 消费者Bean配置在consumer.xml中,可通过ApplicationContext获取或者直接注入到其他类(比如具体的Controller)中. 
         */  
        ApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");  
        System.out.println("Consumer Started");  
    }  
  
}


      从消息队列接受到消息的事件监听:(注意它在consumer.xml中被定义的。)

     

public class MessageListener implements com.aliyun.openservices.ons.api.MessageListener {  
  
    public Action consume(Message message, ConsumeContext context) {  
        System.out.println("Receive: " + message.getMsgID());  
        try {  
            //do something..  
            return Action.CommitMessage;  
        }catch (Exception e) {  
            //消费失败  
            return Action.ReconsumeLater;  
        }  
    }  
  
}

  之后运行发送消息的ProduceWithSpring和接收消息的ConsumeWithSpring即可。但是我发现一个问题,有时候我向消息队列发送10条消息,有时候消费者只捕获到了小于10条的消息传回来,感觉是不是目前公测的消息队列还不是很稳定?

 



版权声明:本文为博主原创文章,未经博主允许不得转载。

php消息队列的应用

最近打算开发一个新功能,计划应用消息队列。 以前对消息队列都是简单的理论了解,真正应用之后把自己的感觉和一些理解整理下来。 =================说正事分割线===============...
  • u014017080
  • u014017080
  • 2016年09月03日 16:26
  • 1625

阿里云消息队列 RocketMQ-常见使用方式说明-消息重试

转自阿里云官方文档 MQ 消费者的消费逻辑失败时,可以通过设置返回状态达到消息重试的结果。 MQ 消息重试只针对集群消费方式生效;广播方式不提供失败重试特性,即消费失败后,失败消息不再重试,继...
  • rqrtqqpqi5
  • rqrtqqpqi5
  • 2017年09月20日 19:43
  • 541

[置顶]【结果很简单,过程很艰辛】记阿里云Ons消息队列服务填坑过程

Maybe 这个问题很简单,因为解决方法是非常简单,但填坑过程会把人逼疯,在阿里云ONS工作人员、同事和朋友的协助下,经过一天的调试和瞎捣鼓,终于解决了这个坑,把问题记下来,也许更多人在碰到类似问题的...
  • asxinyu_usst
  • asxinyu_usst
  • 2016年02月20日 08:57
  • 1277

Redis在唯品会的应用实践-架构演进与功能定制

来自唯品会的高级数据工程师为大家讲解Redis在唯品会的应用实践-架构演进与功能定制,40页PPT,满满的干货。...
  • dajiangtai007
  • dajiangtai007
  • 2017年03月29日 17:06
  • 903

[整理]阿里云之消息队列的使用

阿里云 消息队列 入门
  • macau2008
  • macau2008
  • 2016年06月20日 20:27
  • 12715

基于阿里云容器服务的微服务实践 - Part 1. 微服务与Docker

基于阿里云容器服务的微服务实践 - Part 1. 微服务与Docker作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs从...
  • chszs
  • chszs
  • 2017年02月09日 12:24
  • 4936

为什么要写《机器学习实践应用》这本书

预售地址: https://item.jd.com/12114501.html历经了10个月,《机器学习实践应用》这本书终于面世了。首先呢,因为我的工作比较忙,只能抽一些周末或者是下班以后的时间进行...
  • gshengod
  • gshengod
  • 2017年07月03日 08:59
  • 3547

golang:高性能消息队列moonmq的简单使用

在上一篇moonmq的介绍中(这里),我仅仅简短的罗列了一些moonmq的设计想法,但是对于如何使用并没有详细说明,公司同事无法很好的使用。 对于moonmq的使用,其实很简单,样例代码在这里,...
  • siddontang
  • siddontang
  • 2014年04月24日 14:08
  • 7891

【阿里云】MNS消息队列常见问题及解决方法

阿里云常见用法及错误: 1、往阿里云上推消息,和从阿里云上拉取消息都需要本地服务器时间与阿里云上实际时间一致,也就是不能改时间。改时间会报超时的错误。 错误码:TimeExpired   错误描述:T...
  • xiaopihai86
  • xiaopihai86
  • 2016年09月22日 20:34
  • 7642

消息队列/分布式消息队列介绍及其应用场景

消息队列的定义,以及引入消息队列可解决的问题 1. 消息队列中的“消息”即指同一台计算机的进程间,或不同计算机的进程间传送的数据; “消息队列”是在消息的传输过程中保存消息的容器。 消息被发...
  • apexlj
  • apexlj
  • 2015年12月03日 10:07
  • 2161
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:阿里云消息队列的实践应用
举报原因:
原因补充:

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