mq配置文件(Spring)

主要是顺序消息的配置,以及多实例的配置(需要在控制台配置p/c)

<?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-4.2.xsd">
<!--MQ生产者相关开始-->
<bean id="producer" class="com.aliyun.openservices.ons.api.bean.ProducerBean"
init-method="start" destroy-method="shutdown">
<property name="properties">
<map>
<entry key="ProducerId" value="${ProducerId}"/> <!-- PID,请替换 -->
<entry key="AccessKey" value="${AccessKey}"/> <!-- ACCESS_KEY,请替换 -->
<entry key="SecretKey" value="${SecretKey}"/> <!-- SECRET_KEY,请替换 -->
<entry key="ONSAddr" value="${ONSAddr}"/>
</map>
</property>
</bean>
<!--顺序消息-->
<bean id="mqOrderProducer" class="com.rqbao.mq.listenter.MQOrderProducer"
init-method="start" destroy-method="shutdown">
<constructor-arg name="producerProperties">
<props>
<prop key="ProducerId">${OrderProducerId}</prop>
<prop key="AccessKey">${AccessKey}</prop>
<prop key="SecretKey">${SecretKey}</prop>
<prop key="ONSAddr">${ONSAddr}</prop>
<prop key="ORDER_TOPIC">${ORDER_TOPIC}</prop>
<prop key="TAG">1111</prop>
</props>
</constructor-arg>
</bean>
<!--MQ生产者相关结束--> <!--MQ消费者相关开始-->
<bean id="consumer" class="com.aliyun.openservices.ons.api.bean.ConsumerBean"
init-method="start" destroy-method="shutdown">
<property name="properties">
<map>
<entry key="ConsumerId" value="${OrderConsumerId}"/> <!-- CID,请替换 -->
<entry key="AccessKey" value="${AccessKey}"/> <!-- ACCESS_KEY,请替换 -->
<entry key="SecretKey" value="${SecretKey}"/><!-- SECRET_KEY,请替换 -->
<entry key="ONSAddr" value="${ONSAddr}"/>
</map>
</property> <property name="subscriptionTable">
<map>
<entry value-ref="messageListener">
<key>
<bean class="com.aliyun.openservices.ons.api.bean.Subscription">
<property name="topic" value="${topic}"/> <!-- Topic,请替换 -->
<property name="expression" value="*"/><!-- MessageType名: 多个messageType 用 “||”分割 -->
</bean>
</key>
</entry>
</map> </property>
</bean>
<!--顺序消息-->
<bean id="consumerOrder" class="com.rqbao.mq.listenter.MQOrderConsumer"
init-method="start" destroy-method="shutdown">
<constructor-arg name="consumerProperties">
<props>
<prop key="ConsumerId">${ConsumerId}</prop>
<prop key="AccessKey">${AccessKey}</prop>
<prop key="SecretKey">${SecretKey}</prop>
<prop key="ONSAddr">${ONSAddr}</prop>
<prop key="ORDER_TOPIC">${ORDER_TOPIC}</prop>
<prop key="TAG">1111</prop>
</props>
</constructor-arg>
</bean>
<!-- 消息处理器 -->
<bean id="messageListener" class="com.rqbao.mq.listenter.MQListener"/>
<!--顺序--> <!--MQ消费者相关结束-->
</beans>

顺序生产者

 package com.rqbao.mq.listenter;

import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.order.OrderProducer; import java.util.Properties; /**
* Created by ricky on 2017/7/2.
*/
public class MQOrderProducer {
private Properties producerProperties = new Properties();
private OrderProducer producer; public MQOrderProducer(Properties producerProperties) {
this.producerProperties = producerProperties;
producer = ONSFactory.createOrderProducer(producerProperties);
}
public OrderProducer getOrderProducer(){
return producer;
}
public void start(){
new MQOrderProducer(producerProperties);
producer.start();
}
public void shutdown(){
producer.shutdown();
} public Properties getProducerProperties() {
return producerProperties;
} public void setProducerProperties(Properties producerProperties) {
this.producerProperties = producerProperties;
} public OrderProducer getProducer() {
return producer;
} public void setProducer(OrderProducer producer) {
this.producer = producer;
}
}

顺序消费者

package com.rqbao.mq.listenter;

import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.order.ConsumeOrderContext;
import com.aliyun.openservices.ons.api.order.MessageOrderListener;
import com.aliyun.openservices.ons.api.order.OrderAction;
import com.aliyun.openservices.ons.api.order.OrderConsumer; import java.util.Properties; /**
* Created by ricky on 2017/7/2.
*/
public class MQOrderConsumer {
private Properties consumerProperties = new Properties();
private OrderConsumer consumer; public MQOrderConsumer(Properties consumerProperties) {
this.consumerProperties = consumerProperties;
consumer = ONSFactory.createOrderedConsumer(consumerProperties);
consumer.subscribe(consumerProperties.get("ORDER_TOPIC").toString(), consumerProperties.get("TAG").toString(), new MessageOrderListener() {
@Override
public OrderAction consume(final Message message, final ConsumeOrderContext context) {
System.out.println(message);
return OrderAction.Success;
}
});
}
public void start(){
new MQOrderProducer(consumerProperties);
consumer.start();
}
public void shutdown(){
consumer.shutdown();
} public Properties getConsumerProperties() {
return consumerProperties;
} public void setConsumerProperties(Properties consumerProperties) {
this.consumerProperties = consumerProperties;
} public OrderConsumer getConsumer() {
return consumer;
} public void setConsumer(OrderConsumer consumer) {
this.consumer = consumer;
}
}

参数文件

#ALiMQ相关参数
#入钥
AccessKey=XXXXXX
#秘钥
SecretKey=XXXXXXX
#阿里云MQ线上地址
#PropertyKeyConst.ONSAddr 请根据不同Region进行配置
#公网测试: http://onsaddr-internet.aliyun.com/rocketmq/nsaddr4client-internet
#公有云生产: http://onsaddr-internal.aliyun.com:8080/rocketmq/nsaddr4client-internal
#杭州金融云: http://jbponsaddr-internal.aliyun.com:8080/rocketmq/nsaddr4client-internal
#深圳金融云: http://mq4finance-sz.addr.aliyun.com:8080/rocketmq/nsaddr4client-internal
ONSAddr=http://onsaddr-internet.aliyun.com/rocketmq/nsaddr4client-internet
#主题
topic=RICKY_CGBUSINESS_LOCAL
ORDER_TOPIC=RICKY_CGBUSINESS_TEST
#生产者Id
ProducerId=PID_RICKYCG_LOCAL
OrderProducerId=PID_RICKYCG_TEST
#消费者
ConsumerId=CID_RICKYCG_LOCAL
OrderConsumerId=CID_RICKYCG_TEST

顺序消息生产

import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.SendResult;
import com.aliyun.openservices.ons.api.order.OrderProducer;
import com.rqbao.mq.common.config.Global;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import java.util.Date;
import java.util.UUID; /**
* Created by ricky on 2017/6/8.
*MQ消息生产功能,可能附加一些其他功能
*/
@Service
public class MQOrderService implements InitializingBean{
private static final Logger logger = Logger.getLogger(MQOrderService.class);
@Autowired
MQOrderProducer mqOrderProducer; /**
* 发送顺序MQ消息
* @param TAG 业务tag tag将使用CGUTILS中的存管接口变量
* @param msg 需传递对应接口需要参数,格式待考究
* delayTime 延迟时间 3000--->3s
* @return
*/
public String sendOrderMQMsg(String TAG,String msg){
OrderProducer producer=mqOrderProducer.getOrderProducer();
Message message = new Message(Global.getConfig("ORDER_TOPIC"), TAG,msg.getBytes());
// 设置代表消息的业务关键属性,请尽可能全局唯一。
String orderId = "rqb_" + UUID.randomUUID().toString().replaceAll("-","");
message.setKey(orderId);
// 分区顺序消息中区分不同分区的关键字段,sharding key于普通消息的key是完全不同的概念。
// 全局顺序消息,该字段可以设置为任意非空字符串。
String shardingKey = String.valueOf(orderId);
SendResult sendResult = producer.send(message, shardingKey);
if (sendResult != null) {
System.out.println(new Date() + " Send mq message success! Topic is:" + Global.getConfig("topic") + "msgId is: " + sendResult.getMessageId());
}
return sendResult.toString();
}
@Override
public void afterPropertiesSet() throws Exception { }
}

顺序消息消费

具体在MQOrderConsumer中写消费处理

关于延时和定时消息

依据官方说明,延时消息必须是无序的topic,切记。

可参阅官方文档

问题

MQ存在重复消费的问题,我这里的解决方案是进行MQ消息记录,比如消息有tag再加上body中相关的业务id,联合组成唯一索引,避免重复消费问题。

附demo地址:

http://git.oschina.net/bgt0314/alimq_demo

原文:https://blog.csdn.net/u014042066/article/details/74170723

AliWareMQ的更多相关文章

  1. 》》3D轮播

    * { margin: 0; padding: 0; } .slide { position: absolute; top: calc(50% - 150px); left: calc(50% - 3 ...

  2. RocketMQ 使用情况梳理

    个人梳理有限:欢迎大家 丰富此文档 2018年 12 月 RocketMQ 版本  不适用于 新版关系请勿参考目前规划原则:          topic 创建基于业务  消费者基于模块 多对多关系 ...

随机推荐

  1. 读书笔记 (.NET企业级应用架构设计)

    建议你自己和别人多沟通(学会沟通会使你在公司更好的发展,有意见就提,有问题就问,有困难就说)加油lxp 1.架构师是用来干嘛的: 架构师分析需求,分析系统要去做什么,架构怎么去做 2.架构师的职责是: ...

  2. 组合数取mod

    组合数取mod 条件mod是质数,inv 是逆元,fac是阶层: 用于n在10^5左右 maxn=100505: ll fact[maxn],inv[maxn]; ll Pow(ll x,ll n){ ...

  3. [CF705B] Spider Man - 博弈论

    [CF705B] Description ICG 游戏有若干个环,每次操作将一个环断成非空的两部分,节点数总和不变.集合初态为空,每次向集合中添加一个环,询问当前集合用于游戏的胜负. \(n \le ...

  4. 嵌入式Linux学习---进程(1)

    什么是一个进程?当用户敲入命令执行一个程序的时候,对系统而言,它将启动一个进程.但和程序不同的是,在这个进程中,系统可能需要再启动一个或多个进程来完成独立的多个任务.多进程编程的主要内容包括进程控制和 ...

  5. Linux MYSQL安装指南

    安装环境:系统是 centos6.5 1.下载 下载地址:http://dev.mysql.com/downloads/mysql/5.6.html#downloads 下载版本:我这里选择的5.6. ...

  6. linux 中对 mysql 数据表的基本命令

    显示数据表的结构 describe 表名; 建表 use 库名: create table 表名(字段设定列表): 将表中记录清空 delete from 表名; 删表 drop table 表名:

  7. 在 linux 上运行 oracle sql脚本

    方法一 su - oracle  //切换到oracle用户模式下 sqlplus /nolog  //登录sqlplus connect /as sysdba; //连接orcale @sql脚本路 ...

  8. Oracle VM VirtualBox - 启用 VT-x/AMD-V 支持

    问题描述Oracle VM VirtualBox引入OVF模板时,报错:VT-x/AMD-V 硬件加速已被启用, 但当前处于无效状态. 您虚拟电脑内的操作系统将无法检测到64位的处理器,因此也将无法启 ...

  9. js设计模式之实现观察者模式实例代码

    前端界面 html代码 <body> <select name="" id="select"> <option value=&qu ...

  10. Linux - cron - 基础

    概述 cron 相关的理解与使用 背景 最近实在没啥写的了 我写东西, 一般是是这些 看了书过后, 做一些系统的整理 比如之前的 docker 和 git 系列 遇到了实际问题, 解决过程也不是那么顺 ...