java-srpingboot-demo版本中订阅者代码:
//项目中加上 @Configuration 注解,这样服务启动时consumer也启动了
public class ConsumerClient {
@Autowired
private MqConfig mqConfig;
@Autowired
private DemoMessageListener messageListener;
@Bean(initMethod = "start", destroyMethod = "shutdown")
public ConsumerBean buildConsumer() {
ConsumerBean consumerBean = new ConsumerBean();
//配置文件
Properties properties = mqConfig.getMqPropertie();
properties.setProperty(PropertyKeyConst.GROUP_ID, mqConfig.getGroupId());
//将消费者线程数固定为20个 20为默认值
properties.setProperty(PropertyKeyConst.ConsumeThreadNums, "20");
consumerBean.setProperties(properties);
//订阅关系
Map<Subscription, MessageListener> subscriptionTable = new HashMap<>();
Subscription subscription = new Subscription();
subscription.setTopic(mqConfig.getTopic());
subscription.setExpression(mqConfig.getTag());
subscriptionTable.put(subscription, messageListener);
//订阅多个topic如上面设置
consumerBean.setSubscriptionTable(subscriptionTable);
return consumerBean;
}
}
其中
Map<Subscription, MessageListener> subscriptionTable = new HashMap<>();
Subscription subscription = new Subscription();
subscription.setTopic(mqConfig.getTopic());
subscription.setExpression(mqConfig.getTag());
如果同一个topic不同的tag,无法加入到subscriptionTable 中,因为Subscription 重写了hashCode equals方法
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((topic == null) ? 0 : topic.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Subscription other = (Subscription) obj;
if (topic == null) {
if (other.topic != null) {
return false;
}
} else if (!topic.equals(other.topic)) {
return false;
}
return true;
}
所以对于同一个topic不同的tag的场景,如何去使用?
查询 官方文档

那么如何根据不同的TAG区分不同的业务处理?例如在自己的MessageListener 中区分:
@Override
public Action consume(Message message, ConsumeContext context) {
try {
message.getTag(); // 根据tag区分不同业务????
return Action.CommitMessage;
} catch (Exception e) {
return Action.ReconsumeLater;
}
}
java-srpingboot-demo版本中订阅者代码:
其中
如果同一个
topic不同的tag,无法加入到subscriptionTable中,因为Subscription重写了hashCodeequals方法所以对于同一个
topic不同的tag的场景,如何去使用?查询 官方文档
那么如何根据不同的TAG区分不同的业务处理?例如在自己的
MessageListener中区分: