RocketMq消息监听程序消除大量的if..else
承接上一篇文章,如果消费端订阅了多个topic和tag,则需要在消息监听器类中添加if..else,根据topic和tag处理不同的业务逻辑,使得消息监听类职责过重。
大概思路
消息监听器类只负责监听消息,获取到消息后通过topic和tag路由到需要调用的服务,消费者只需要编写对应的topic和tag的服务。
为了监听器类可以通过topic和tag路由到需要调用的服务,自定义一个消费者注解MQConsumeService(该注解包含topic和tag的定义),消费者实现类上添加该注解,然后就可以在监听器类中通过反射获取到实现类上面注解的topic和tag,和监听到的topic和tag比较,如果相同则调用该服务。
定义MQConsumeService注解
package com.clouds.common.rocketmq.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.stereotype.Service;
import com.clouds.common.rocketmq.TopicEnum;
/**
* 此注解用于标注消费者服务
* .<br/>
*
* Copyright: Copyright (c) 2017 zteits
*
* @ClassName: MQConsumeService
* @Description:
* @version: v1.0.0
* @author: zhaowg
* @date: 2018年3月2日 下午1:15:52
* Modification History:
* Date Author Version Description
*---------------------------------------------------------*
* 2018年3月2日 zhaowg v1.0.0 创建
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Service
public @interface MQConsumeService {
/**
* 消息主题
*/
TopicEnum topic();
/**
* 消息标签,如果是该主题下所有的标签,使用“*”
*/
String[] tags();
}
定义消费者返回消息Bean
package com.clouds.common.rocketmq.consumer.processor;
import java.io.Serializable;
/**
* 消费结果
* .<br/>
*
* Copyright: Copyright (c) 2017 zteits
*
* @ClassName: MQConsumeResult
* @Description:
* @version: v1.0.0
* @author: zhaowg
* @date: 2018年3月1日 上午11:12:55
* Modification History:
* Date Author Version Description
*---------------------------------------------------------*
* 2018年3月1日 zhaowg v1.0.0 创建
*/
public class MQConsumeResult implements Serializable{
private static final long serialVersionUID = 1L;
/**
* 是否处理成功
*/
private boolean isSuccess;
/**
* 如果处理失败,是否允许消息队列继续调用,直到处理成功,默认true
*/
private boolean isReconsumeLater = true;
/**
* 是否需要记录消费日志,默认不记录
*/
private boolean isSaveConsumeLog = false;
/**
* 错误Code
*/
private String errCode;
/**
* 错误消息
*/
private String errMsg;
/**
* 错误堆栈
*/
private Throwable e;
//省略set和get方法
}
定义统一的消息处理接口
package com.clouds.common.rocketmq.consumer.processor;
import java.util.List;
import com.alibaba.rocketmq.common.message.MessageExt;
/**
* 消息队列-消息消费处理接口
* .<br/>
*
* Copyright: Copyright (c) 2017 zteits
*
* @ClassName: MQMsgProcessorService
* @Description:
* @version: v1.0.0
* @author: zhaowg
* @date: 2018年3月1日 上午9:57:57
* Modification History:
* Date Author Version Description
*---------------------------------------------------------*
* 2018年3月1日 zhaowg v1