使用阿里云消息队列

控制台地址:http://ons.console.aliyun.com/#/home/topic

Demo:

支付消息mq工厂类:

public class DfacePayConsumerFactory {

    public static String        CID = "CID-";
  
  //监听执行实例
@Autowired
private DfacePayConsumerListener dfacePayConsumerListener; private String topic;
private String pTag;
private String accessKey;
private String secretKey;
private String tag; private Consumer consumer; /**
* @return the topic
*/
public String getTopic() {
return topic;
} /**
* @param topic the topic to set
*/
public void setTopic(String topic) {
this.topic = topic;
} /**
* @return the tag
*/
public String getTag() {
return tag;
} /**
* @param tag the tag to set
*/
public void setTag(String tag) {
this.tag = tag;
} /**
* @return the pTag
*/
public String getpTag() {
return pTag;
} /**
* @param pTag the pTag to set
*/
public void setpTag(String pTag) {
this.pTag = pTag;
} /**
* @return the accessKey
*/
public String getAccessKey() {
return accessKey;
} /**
* @param accessKey the accessKey to set
*/
public void setAccessKey(String accessKey) {
this.accessKey = accessKey;
} /**
* @return the secretKey
*/
public String getSecretKey() {
return secretKey;
} /**
* @param secretKey the secretKey to set
*/
public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
} public void initConsumer() { Properties properties = new Properties();
String consumerId = CID + this.topic
+ (StringUtils.hasText(this.pTag) ? "-" + this.pTag : "");
properties.put(PropertyKeyConst.ConsumerId, consumerId);
properties.put(PropertyKeyConst.AccessKey, this.accessKey);
properties.put(PropertyKeyConst.SecretKey, this.secretKey);      /**
     ( 
     //相关属性介绍:
     //Properties properties = new Properties();
     //properties.put(PropertyKeyConst.ConsumerId, consumerLocal.getConsumerId());
     // AccessKey 阿里云身份验证,在阿里云服务器管理控制台创建
     //properties.put(PropertyKeyConst.AccessKey, consumerLocal.getAccessKey());
     // SecretKey 阿里云身份验证,在阿里云服务器管理控制台创建
     //properties.put(PropertyKeyConst.SecretKey, consumerLocal.getSecreKey());
     //消息处理失败后多久重新发送消息
     properties.put(PropertyKeyConst.SuspendTimeMillis, consumerLocal.getSuspendTimeMillis());
     //重发的次数
     //properties.put(PropertyKeyConst.MaxReconsumeTimes, consumerLocal.getMaxReconsumeTimes());
     //消费者的线程数
     //properties.put(PropertyKeyConst.ConsumeThreadNums,"1");
     //消费者的介入地址
     //properties.put(PropertyKeyConst.ONSAddr, consumerLocal.getOnsAddress());
     )
     **/
 
consumer = ONSFactory.createConsumer(properties);
consumer.subscribe(topic, tag, this.dfacePayConsumerListener);
new Thread(new Runnable() { @Override
public void run() {
try {
Thread.sleep(90000);
} catch (InterruptedException e) {
e.printStackTrace();
}
consumer.start();
}
}).start(); Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
shutDown();
}
});
} /**
* 停止监听
*
* @return
*/
public boolean shutDown() {
if (null != this.consumer) {
this.consumer.shutdown();
return true;
}
return false;
}
}
//dPay支付监听  执行mq consume消息接收(通过topic订阅)
@Component("dfacePayConsumerListener")
public class DfacePayConsumerListener implements MessageListener {
private static Logger logger = LoggerFactory.getLogger(DfacePayConsumerListener.class); @Autowired
private ...; @Override
public Action consume(Message message, ConsumeContext context) {
String msg = new String(message.getBody());
String tag = message.getTag();
logger.info(LogUtils.builder().append("mq", "接受mq").append("mqTag", tag)
.append("mqMsg", msg).toString());
return tagHandle(tag, msg, message);
} public Action tagHandle(String tag, String msg, Message message) {
if (MqTagEnum.PAY.name().equals(tag)) {
try {
PayBackBo payBackBo = JSON.parse(msg, PayBackBo.class);
//检查订单号
if (!payBackBo.getOrderNo().startsWith(ApplicationConstant.APP_NO)) {
logger.info(LogUtils.format("订单支付失败: orderNo 前缀 ", payBackBo.getOrderNo()));
return Action.CommitMessage;
}
return giftOrderHandle(payBackBo);
} catch (Exception e) {
e.printStackTrace();
logger.info(LogUtils.format("paid_error", e.getMessage()));
return Action.ReconsumeLater;
}
} else {
logger.info(LogUtils.builder().append("tag error", tag).append("msg", msg)
.append("message", message).toString());
}
return Action.CommitMessage;
} /**
* 支付订单处理
*
* @param payBackBo
* @return
*/
private Action giftOrderHandle(PayBackBo payBackBo) {
//处理支付业务逻辑
} }

阿里云 消息队列mq的更多相关文章

  1. 使用java实现阿里云消息队列简单封装

    一.前言 最近公司有使用阿里云消息队列的需求,为了更加方便使用,本人用了几天时间将消息队列封装成api调用方式以方便内部系统的调用,现在已经完成,特此记录其中过程和使用到的相关技术,与君共勉. 现在阿 ...

  2. Sping Boot入门到实战之实战篇(一):实现自定义Spring Boot Starter——阿里云消息队列服务Starter

    在 Sping Boot入门到实战之入门篇(四):Spring Boot自动化配置 这篇中,我们知道Spring Boot自动化配置的实现,主要由如下几部分完成: @EnableAutoConfigu ...

  3. 阿里云消息队列(MQ)服务

    A.首先在阿里云上申请消息队列MQ服务: B.然后创建一个Topic(主题,一级主题):然后创建生产者与消费者: C.不过此时还没有结束 ,还需要创建一个AccessKey和AccessSecret( ...

  4. 阿里云消息队列MQ_HTTP接入 for .NetCore 简单例子

    , , )).TotalMilliseconds;                 , , )).TotalMilliseconds;                 )                ...

  5. 阿里云消息队列的C#使用http接口发送消息实例

    app.config <appSettings> <clear/> <add key="Ons_Topic" value="XXX_Fini ...

  6. 消息队列 MQ 入门理解

    功能特性: 应用场景: 消息队列 MQ 可应用于如下几个场景: 分布式事务 在传统的事务处理中,多个系统之间的交互耦合到一个事务中,响应时间长,影响系统可用性.引入分布式事务消息,交易系统和消息队列之 ...

  7. 详解RPC远程调用和消息队列MQ的区别

    PC(Remote Procedure Call)远程过程调用,主要解决远程通信间的问题,不需要了解底层网络的通信机制. RPC框架 知名度较高的有Thrift(FB的).dubbo(阿里的). RP ...

  8. 消息队列MQ简介

    项目中要用到RabbitMQ,领导让我先了解一下.在之前的公司中,用到过消息队列MQ,阿里的那款RocketMQ,当时公司也做了简单的技术分享,自己也看了一些博客.自己在有道云笔记上,做了一些整理,但 ...

  9. 为什么会需要消息队列(MQ)?

    为什么会需要消息队列(MQ)? #################################################################################### ...

随机推荐

  1. UI库colorui的使用————小程序

    UI库colorui的使用----小程序 把colorui文件放到你的小程序中 包含文件: icon.wxss+main.wxss+components(文件夹里有icon和一些组件)+animati ...

  2. XMPP即时通讯协议使用(前传)——协议详解

    XMPP详解 XMPP(eXtensible Messaging and Presence Protocol,可扩展消息处理和现场协议)是一种在两个地点间传递小型结构化数据的协议.在此基础上,XMPP ...

  3. C# 对象转JSON字符串

    对象转JSON字符串 /// <summary> /// 对象转Json字符串 /// </summary> /// <param name="obj" ...

  4. 系统INIT 启动脚本的结构/etc/rc.d/init.d/*

  5. linux系统安装MongoDB文档

    mongodb文档数据库的安装: wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.4.tgz tar -zx ...

  6. Splay平衡树入门小结

    学习到这部分算是数据结构比较难的部分了,平衡树不好理解代码量大,但在某些情况下确实是不可替代的,所以还是非学不可. 建议先学Treap之后在学Splay,因为其实Splay有不少操作和Treap差不多 ...

  7. 【挖坟】HDU3205 Factorization

    分圆多项式 问题在于精度貌似出了一些奇怪的问题... [输出也写的有问题QAQ] 完全不会处理了 加上全网没有题解T^T 挖个坑以后补.. #include<cstdio> #includ ...

  8. XML及XML的解析

    XML的用途 充当显示数据(以XML充当显示层) 存储数据的功能 以XML描述数据,并在联系服务器与系统的其余部分之间传递.(传输数据的一种格式),从某种角度来讲,XML是数据封装和消息传递技术 SA ...

  9. python的转义字符,以及字符串输出转义字符

    Python的转义字符及其含义     符    号     说     明       \'   单引号       \"   双引号       \a   发出系统响铃声       \ ...

  10. Xcode7.1环境下上架iOS App到AppStore 流程②

    前言部分 part二部分主要讲解 iOS App IDs 的创建.概要文件的配置.以及概要文件安装的过程. 一.iOS App IDs 的创建 1)进入如图1所示界面点击右上角箭头所指的加号 进入iO ...