
org.frameworkset.rocketmq.BaseRocketMQConsumerThread Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of bboss-plugin-rocketmq Show documentation
Show all versions of bboss-plugin-rocketmq Show documentation
bboss-plugins project,include Kafka,rocketmq,nacos,apollo,log4j,spring,word2pdf,pdf2swf,hibernate,dubbo plugins.
The newest version!
package org.frameworkset.rocketmq;
import com.frameworkset.util.SimpleStringUtil;
import org.apache.rocketmq.acl.common.AclClientRPCHook;
import org.apache.rocketmq.acl.common.SessionCredentials;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel;
import org.frameworkset.rocketmq.codec.CodecDeserial;
import org.frameworkset.rocketmq.codec.RocketmqMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
public class BaseRocketMQConsumerThread extends Thread {
private static final Logger logger = LoggerFactory.getLogger(BaseRocketMQConsumerThread.class);
private String accessKey;
private String secretKey;
private String securityToken;
private String signature;
/**
* namesrv地址
*/
private String namesrvAddr ;
private String consumeFromWhere;
private String messageModel ;
/**
* 单位到秒
* 20191024171201
*/
private String consumeTimestamp;
private Boolean enableSsl ;
private String tag ;
// private Long awaitDuration = 10000l;
private String consumerGroup;
protected StoreService storeService;
protected String workThreadname;
protected boolean shutdown ;
protected BaseRocketMQConsumer consumer;
private DefaultMQPushConsumer defaultMQPushConsumer;
protected String[] topics;
protected CodecDeserial keyCodecDeserial;
protected CodecDeserial valueCodecDeserial;
protected Integer maxPollRecords;
protected Integer consumeMessageBatchMaxSize;
protected Integer workThreads =20;
/**
* 队列编号
*/
protected int partition;
public void setValueCodecDeserial(CodecDeserial valueCodecDeserial) {
this.valueCodecDeserial = valueCodecDeserial;
}
public Integer getConsumeMessageBatchMaxSize() {
return consumeMessageBatchMaxSize;
}
public CodecDeserial getKeyCodecDeserial() {
return keyCodecDeserial;
}
public void setKeyCodecDeserial(CodecDeserial keyCodecDeserial) {
this.keyCodecDeserial = keyCodecDeserial;
}
public void setConsumeMessageBatchMaxSize(Integer consumeMessageBatchMaxSize) {
this.consumeMessageBatchMaxSize = consumeMessageBatchMaxSize;
}
public BaseRocketMQConsumerThread(int partition, BaseRocketMQConsumer consumer, String[] topics, StoreService storeService) {
super("RocketmqBatchConsumer-"+topicsStr(topics)+"-p"+partition);
workThreadname = this.getName() + "-work";
this.storeService = storeService;
this.partition = partition;
this.consumer = consumer;
this.topics = topics;
}
public String getConsumeFromWhere() {
return consumeFromWhere;
}
public void setConsumeFromWhere(String consumeFromWhere) {
this.consumeFromWhere = consumeFromWhere;
}
private static String topicsStr(String[] topics){
StringBuilder builder = new StringBuilder();
boolean s = false;
for(String topic:topics) {
if(!s) {
builder.append(topic);
s = true;
}
else{
builder.append(",").append(topic);
}
}
return builder.toString();
}
public void setWorkThreads(Integer workThreads) {
this.workThreads = workThreads;
}
public Integer getWorkThreads() {
return workThreads;
}
public void setMaxPollRecords(Integer maxPollRecords) {
this.maxPollRecords = maxPollRecords;
}
public Integer getMaxPollRecords() {
return maxPollRecords;
}
private boolean consumerClosed;
private void closeConsumer(){
synchronized (this){
if(consumerClosed)
return;
consumerClosed = true;
}
try {
if (this.defaultMQPushConsumer != null) {
defaultMQPushConsumer.shutdown();
logger.info("simpleConsumer[{}] closed topic:{}",workThreadname,topics);
}
}
catch (Exception e){
// consumerClosed = false;
logger.warn("simpleConsumer["+workThreadname+"] closed topic:"+topics,e);
}
}
public void shutdown(){
synchronized (this) {
if (shutdown)
return;
this.shutdown = true;
}
closeConsumer();
try {
this.join();
}
catch (Exception e){
}
}
private synchronized void buildConsumerAndSubscribe() {
if(shutdown)
return;
DefaultMQPushConsumer consumer = null;
try {
/*
* Instantiate with specified consumer group name.
*/
//消费者
AclClientRPCHook auth = null;
if(SimpleStringUtil.isNotEmpty(accessKey)) {
SessionCredentials sessionCredentials = new SessionCredentials(accessKey, secretKey, securityToken);
sessionCredentials.setSignature(signature);
auth = new AclClientRPCHook(sessionCredentials);
}
consumer = new DefaultMQPushConsumer(this.consumerGroup,auth);
if(enableSsl != null)
consumer.setUseTLS(enableSsl);
consumer.setConsumeThreadMax(workThreads);
consumer.setConsumeThreadMin(workThreads);
consumer.setPullBatchSize(maxPollRecords);
consumer.setConsumeMessageBatchMaxSize(consumeMessageBatchMaxSize);
/*
* Specify name server addresses.
*
*
* Alternatively, you may specify name server addresses via exporting environmental variable: NAMESRV_ADDR
*
* {@code
* consumer.setNamesrvAddr("name-server1-ip:9876;name-server2-ip:9876");
* }
*
*/
// Uncomment the following line while debugging, namesrvAddr should be set to your local address
consumer.setNamesrvAddr(this.getNamesrvAddr());
if(messageModel != null){
if(messageModel.equals(MessageModel.CLUSTERING.getModeCN())){
consumer.setMessageModel(MessageModel.CLUSTERING);
}
else if(messageModel.equals(MessageModel.BROADCASTING.getModeCN())){
consumer.setMessageModel(MessageModel.BROADCASTING);
}
else{
logger.warn("Unsupport MessageModel:{}",messageModel);
}
}
/*
* Specify where to start in case the specific consumer group is a brand-new one.
*/
consumer.setConsumeFromWhere(convertConsumeFromWhere(consumer, consumeFromWhere));
String _tag = null;
/*
* Subscribe one more topic to consume.
*/
if(SimpleStringUtil.isNotEmpty(tag)) {
_tag = tag;
}
else{
_tag = "*";
}
for(String topic:topics){
if(logger.isInfoEnabled()) {
logger.info("Subscribe topic:{},tag:{},messageModel:{},consumeFromWhere:{},namesrvAddr:{}," +
"consumeMessageBatchMaxSize:{},maxPollRecords:{},workThreads:{},enableSsl:{},consumerGroup:{},accessKey:{}, secretKey:{}, securityToken:{},signature:{}" +
",keyCodecDeserial:{},valueCodecDeserial:{}",
topic, _tag, messageModel, consumeFromWhere, namesrvAddr, consumeMessageBatchMaxSize, maxPollRecords, workThreads, enableSsl, consumerGroup,
accessKey, "******"/*secretKey*/, securityToken, signature,
keyCodecDeserial != null ? keyCodecDeserial.getClass().getCanonicalName() : "",
valueCodecDeserial != null ? valueCodecDeserial.getClass().getCanonicalName() : ""
);
}
consumer.subscribe(topic, _tag);
}
/*
* Register callback to execute on arrival of messages fetched from brokers.
*/
consumer.registerMessageListener((MessageListenerConcurrently) (msg, context) -> {
// System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msg);
try {
doHandle(msg);
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
catch (RockemqException rockemqException){
logger.error("",rockemqException);
return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}
});
/*
* Launch the consumer instance.
*/
consumer.start();
this.defaultMQPushConsumer = consumer;
}
catch (Exception e){
if(consumer != null){
try{
consumer.shutdown();
}
catch (Exception ex){
}
}
throw new RockemqException(e);
}
}
private ConsumeFromWhere convertConsumeFromWhere(DefaultMQPushConsumer consumer,String consumeFromWhere){
if(consumeFromWhere == null){
return null;
}
if(consumeFromWhere.equals("CONSUME_FROM_LAST_OFFSET")){
return ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET;
}
else if(consumeFromWhere.equals("CONSUME_FROM_LAST_OFFSET_AND_FROM_MIN_WHEN_BOOT_FIRST")){
return ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET_AND_FROM_MIN_WHEN_BOOT_FIRST;
}
else if(consumeFromWhere.equals("CONSUME_FROM_MIN_OFFSET")){
return ConsumeFromWhere.CONSUME_FROM_MIN_OFFSET;
}
else if(consumeFromWhere.equals("CONSUME_FROM_MAX_OFFSET")){
return ConsumeFromWhere.CONSUME_FROM_MAX_OFFSET;
}
else if(consumeFromWhere.equals("CONSUME_FROM_FIRST_OFFSET")){
return ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET;
}
else if(consumeFromWhere.equals("CONSUME_FROM_TIMESTAMP")){
//defaultLitePullConsumer.setConsumeTimestamp("20191024171201");
consumer.setConsumeTimestamp(consumeTimestamp);
return ConsumeFromWhere.CONSUME_FROM_TIMESTAMP;
}
else {
logger.warn("Unknown consumeFromWhere: {}",consumeFromWhere);
}
return null;
}
@Override
public void run() {
buildConsumerAndSubscribe();
}
private void doHandle(List records){
try {
List messages = new ArrayList<>(records.size());
for(MessageExt messageExt:records){
messages.add(valueCodecDeserial.deserial(messageExt));
}
storeService.store(messages);
}
catch (RockemqException e) {
throw e;
}
catch (Exception e) {
throw new RockemqException(e);
} catch (Throwable e) {
throw new RockemqException(e);
}
}
public String getConsumerGroup() {
return consumerGroup;
}
public void setConsumerGroup(String consumerGroup) {
this.consumerGroup = consumerGroup;
}
public String getAccessKey() {
return accessKey;
}
public void setAccessKey(String accessKey) {
this.accessKey = accessKey;
}
public String getSecretKey() {
return secretKey;
}
public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}
public Boolean getEnableSsl() {
return enableSsl;
}
public void setEnableSsl(Boolean enableSsl) {
this.enableSsl = enableSsl;
}
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
}
public String getNamesrvAddr() {
return namesrvAddr;
}
public void setNamesrvAddr(String namesrvAddr) {
this.namesrvAddr = namesrvAddr;
}
public String[] getTopics() {
return topics;
}
public void setTopics(String[] topics) {
this.topics = topics;
}
public void setSignature(String signature) {
this.signature = signature;
}
public void setSecurityToken(String securityToken) {
this.securityToken = securityToken;
}
public void setConsumeTimestamp(String consumeTimestamp) {
this.consumeTimestamp = consumeTimestamp;
}
public String getMessageModel() {
return messageModel;
}
public void setMessageModel(String messageModel) {
this.messageModel = messageModel;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy