|
|
@ -16,19 +16,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
package com.alibaba.cloud.stream.binder.rocketmq.consuming;
|
|
|
|
package com.alibaba.cloud.stream.binder.rocketmq.consuming;
|
|
|
|
|
|
|
|
|
|
|
|
import java.util.List;
|
|
|
|
import com.alibaba.cloud.stream.binder.rocketmq.RocketMQMessageChannelBinder;
|
|
|
|
import java.util.Objects;
|
|
|
|
import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQBinderConfigurationProperties;
|
|
|
|
|
|
|
|
import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQConsumerProperties;
|
|
|
|
import org.apache.rocketmq.acl.common.AclClientRPCHook;
|
|
|
|
import org.apache.rocketmq.acl.common.AclClientRPCHook;
|
|
|
|
import org.apache.rocketmq.acl.common.SessionCredentials;
|
|
|
|
import org.apache.rocketmq.acl.common.SessionCredentials;
|
|
|
|
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
|
|
|
|
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
|
|
|
|
import org.apache.rocketmq.client.consumer.MessageSelector;
|
|
|
|
import org.apache.rocketmq.client.consumer.MessageSelector;
|
|
|
|
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
|
|
|
|
import org.apache.rocketmq.client.consumer.listener.*;
|
|
|
|
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
|
|
|
|
|
|
|
|
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyContext;
|
|
|
|
|
|
|
|
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;
|
|
|
|
|
|
|
|
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
|
|
|
|
|
|
|
|
import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;
|
|
|
|
|
|
|
|
import org.apache.rocketmq.client.consumer.rebalance.AllocateMessageQueueAveragely;
|
|
|
|
import org.apache.rocketmq.client.consumer.rebalance.AllocateMessageQueueAveragely;
|
|
|
|
import org.apache.rocketmq.client.exception.MQClientException;
|
|
|
|
import org.apache.rocketmq.client.exception.MQClientException;
|
|
|
|
import org.apache.rocketmq.common.UtilAll;
|
|
|
|
import org.apache.rocketmq.common.UtilAll;
|
|
|
@ -49,12 +44,19 @@ import org.springframework.context.SmartLifecycle;
|
|
|
|
import org.springframework.util.Assert;
|
|
|
|
import org.springframework.util.Assert;
|
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
|
|
|
|
|
|
|
|
import com.alibaba.cloud.stream.binder.rocketmq.RocketMQMessageChannelBinder;
|
|
|
|
import java.util.List;
|
|
|
|
import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQBinderConfigurationProperties;
|
|
|
|
import java.util.Objects;
|
|
|
|
import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQConsumerProperties;
|
|
|
|
|
|
|
|
|
|
|
|
import static com.alibaba.cloud.stream.binder.rocketmq.RocketMQBinderConstants.ROCKETMQ_RECONSUME_TIMES;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
|
|
|
|
* A class that Listen on rocketmq message
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* this class will delegate {@link RocketMQListener} to handle message
|
|
|
|
|
|
|
|
*
|
|
|
|
* @author <a href="mailto:fangjian0423@gmail.com">Jim</a>
|
|
|
|
* @author <a href="mailto:fangjian0423@gmail.com">Jim</a>
|
|
|
|
|
|
|
|
* @author <a href="mailto:jiashuai.xie01@gmail.com">Xiejiashuai</a>
|
|
|
|
|
|
|
|
* @see RocketMQListener
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public class RocketMQListenerBindingContainer
|
|
|
|
public class RocketMQListenerBindingContainer
|
|
|
|
implements InitializingBean, RocketMQListenerContainer, SmartLifecycle {
|
|
|
|
implements InitializingBean, RocketMQListenerContainer, SmartLifecycle {
|
|
|
@ -112,8 +114,7 @@ public class RocketMQListenerBindingContainer
|
|
|
|
if (StringUtils.isEmpty(rocketMQConsumerProperties.getExtension().getSql())) {
|
|
|
|
if (StringUtils.isEmpty(rocketMQConsumerProperties.getExtension().getSql())) {
|
|
|
|
this.selectorType = SelectorType.TAG;
|
|
|
|
this.selectorType = SelectorType.TAG;
|
|
|
|
this.selectorExpression = rocketMQConsumerProperties.getExtension().getTags();
|
|
|
|
this.selectorExpression = rocketMQConsumerProperties.getExtension().getTags();
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
else {
|
|
|
|
|
|
|
|
this.selectorType = SelectorType.SQL92;
|
|
|
|
this.selectorType = SelectorType.SQL92;
|
|
|
|
this.selectorExpression = rocketMQConsumerProperties.getExtension().getSql();
|
|
|
|
this.selectorExpression = rocketMQConsumerProperties.getExtension().getSql();
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -161,8 +162,7 @@ public class RocketMQListenerBindingContainer
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
consumer.start();
|
|
|
|
consumer.start();
|
|
|
|
}
|
|
|
|
} catch (MQClientException e) {
|
|
|
|
catch (MQClientException e) {
|
|
|
|
|
|
|
|
throw new IllegalStateException("Failed to start RocketMQ push consumer", e);
|
|
|
|
throw new IllegalStateException("Failed to start RocketMQ push consumer", e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.setRunning(true);
|
|
|
|
this.setRunning(true);
|
|
|
@ -211,8 +211,7 @@ public class RocketMQListenerBindingContainer
|
|
|
|
consumer.setInstanceName(RocketMQUtil.getInstanceName(rpcHook,
|
|
|
|
consumer.setInstanceName(RocketMQUtil.getInstanceName(rpcHook,
|
|
|
|
topic + "|" + UtilAll.getPid()));
|
|
|
|
topic + "|" + UtilAll.getPid()));
|
|
|
|
consumer.setVipChannelEnabled(false);
|
|
|
|
consumer.setVipChannelEnabled(false);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
else {
|
|
|
|
|
|
|
|
consumer = new DefaultMQPushConsumer(consumerGroup,
|
|
|
|
consumer = new DefaultMQPushConsumer(consumerGroup,
|
|
|
|
rocketBinderConfigurationProperties.isEnableMsgTrace(),
|
|
|
|
rocketBinderConfigurationProperties.isEnableMsgTrace(),
|
|
|
|
rocketBinderConfigurationProperties.getCustomizedTraceTopic());
|
|
|
|
rocketBinderConfigurationProperties.getCustomizedTraceTopic());
|
|
|
@ -368,7 +367,7 @@ public class RocketMQListenerBindingContainer
|
|
|
|
public class DefaultMessageListenerConcurrently
|
|
|
|
public class DefaultMessageListenerConcurrently
|
|
|
|
implements MessageListenerConcurrently {
|
|
|
|
implements MessageListenerConcurrently {
|
|
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
|
@SuppressWarnings({"unchecked", "Duplicates"})
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
|
|
|
|
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
|
|
|
|
ConsumeConcurrentlyContext context) {
|
|
|
|
ConsumeConcurrentlyContext context) {
|
|
|
@ -376,12 +375,12 @@ public class RocketMQListenerBindingContainer
|
|
|
|
log.debug("received msg: {}", messageExt);
|
|
|
|
log.debug("received msg: {}", messageExt);
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
long now = System.currentTimeMillis();
|
|
|
|
long now = System.currentTimeMillis();
|
|
|
|
|
|
|
|
preOnMessage(messageExt);
|
|
|
|
rocketMQListener
|
|
|
|
rocketMQListener
|
|
|
|
.onMessage(RocketMQUtil.convertToSpringMessage(messageExt));
|
|
|
|
.onMessage(RocketMQUtil.convertToSpringMessage(messageExt));
|
|
|
|
long costTime = System.currentTimeMillis() - now;
|
|
|
|
long costTime = System.currentTimeMillis() - now;
|
|
|
|
log.debug("consume {} cost: {} ms", messageExt.getMsgId(), costTime);
|
|
|
|
log.debug("consume {} message key:[{}] cost: {} ms", messageExt.getMsgId(), messageExt.getKeys(), costTime);
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
catch (Exception e) {
|
|
|
|
|
|
|
|
log.warn("consume message failed. messageExt:{}", messageExt, e);
|
|
|
|
log.warn("consume message failed. messageExt:{}", messageExt, e);
|
|
|
|
context.setDelayLevelWhenNextConsume(delayLevelWhenNextConsume);
|
|
|
|
context.setDelayLevelWhenNextConsume(delayLevelWhenNextConsume);
|
|
|
|
return ConsumeConcurrentlyStatus.RECONSUME_LATER;
|
|
|
|
return ConsumeConcurrentlyStatus.RECONSUME_LATER;
|
|
|
@ -394,7 +393,7 @@ public class RocketMQListenerBindingContainer
|
|
|
|
|
|
|
|
|
|
|
|
public class DefaultMessageListenerOrderly implements MessageListenerOrderly {
|
|
|
|
public class DefaultMessageListenerOrderly implements MessageListenerOrderly {
|
|
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
|
@SuppressWarnings({"unchecked", "Duplicates"})
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs,
|
|
|
|
public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs,
|
|
|
|
ConsumeOrderlyContext context) {
|
|
|
|
ConsumeOrderlyContext context) {
|
|
|
@ -402,12 +401,12 @@ public class RocketMQListenerBindingContainer
|
|
|
|
log.debug("received msg: {}", messageExt);
|
|
|
|
log.debug("received msg: {}", messageExt);
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
long now = System.currentTimeMillis();
|
|
|
|
long now = System.currentTimeMillis();
|
|
|
|
|
|
|
|
preOnMessage(messageExt);
|
|
|
|
rocketMQListener
|
|
|
|
rocketMQListener
|
|
|
|
.onMessage(RocketMQUtil.convertToSpringMessage(messageExt));
|
|
|
|
.onMessage(RocketMQUtil.convertToSpringMessage(messageExt));
|
|
|
|
long costTime = System.currentTimeMillis() - now;
|
|
|
|
long costTime = System.currentTimeMillis() - now;
|
|
|
|
log.info("consume {} cost: {} ms", messageExt.getMsgId(), costTime);
|
|
|
|
log.debug("consume {} message key:[{}] cost: {} ms", messageExt.getMsgId(), messageExt.getKeys(), costTime);
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
catch (Exception e) {
|
|
|
|
|
|
|
|
log.warn("consume message failed. messageExt:{}", messageExt, e);
|
|
|
|
log.warn("consume message failed. messageExt:{}", messageExt, e);
|
|
|
|
context.setSuspendCurrentQueueTimeMillis(
|
|
|
|
context.setSuspendCurrentQueueTimeMillis(
|
|
|
|
suspendCurrentQueueTimeMillis);
|
|
|
|
suspendCurrentQueueTimeMillis);
|
|
|
@ -419,4 +418,14 @@ public class RocketMQListenerBindingContainer
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* pre handle message before the consumer handle message
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param messageExt the rocketmq message
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
private void preOnMessage(MessageExt messageExt) {
|
|
|
|
|
|
|
|
int reconsumeTimes = messageExt.getReconsumeTimes();
|
|
|
|
|
|
|
|
messageExt.putUserProperty(ROCKETMQ_RECONSUME_TIMES, String.valueOf(reconsumeTimes));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|