1.需要阿里云开通商业版RocketMQ
普通消息新建普通主题,普通组,延迟消息新建延迟消息主题,延迟消息组
2.结构目录
3.引入依赖
<!--阿里云RocketMq整合-->
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>ons-client</artifactId>
<version>1.8.8.5.Final</version>
</dependency>
4.延迟消息配置
import com.aliyun.openservices.ons.api.PropertyKeyConst;
import com.aliyun.openservices.ons.api.batch.BatchMessageListener;
import com.aliyun.openservices.ons.api.bean.BatchConsumerBean;
import com.aliyun.openservices.ons.api.bean.Subscription;
import com.atkj.devicewx.config.MqConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
/**
* 延迟消息配置类
*/
@Configuration
public class BatchConsumerClient {
@Autowired
private MqConfig mqConfig;
@Autowired
private BatchDemoMessageListener messageListener;
@Bean(initMethod = "start", destroyMethod = "shutdown")
public BatchConsumerBean buildBatchConsumer() {
BatchConsumerBean batchConsumerBean = new BatchConsumerBean();
//配置文件
Properties properties = mqConfig.getMqPropertie();
properties.setProperty(PropertyKeyConst.GROUP_ID, mqConfig.getDelayGroupId());
//将消费者线程数固定为20个 20为默认值
properties.setProperty(PropertyKeyConst.ConsumeThreadNums, "20");
batchConsumerBean.setProperties(properties);
//订阅关系
Map<Subscription, BatchMessageListener> subscriptionTable = new HashMap<Subscription, BatchMessageListener>();
Subscription subscription = new Subscription();
subscription.setTopic(mqConfig.getDelayTopic());
subscription.setExpression(mqConfig.getDelayTag());
subscriptionTable.put(subscription, messageListener);
//订阅多个topic如上面设置
batchConsumerBean.setSubscriptionTable(subscriptionTable);
return batchConsumerBean;
}
}
import com.aliyun.openservices.ons.api.Action;
import com.aliyun.openservices.ons.api.ConsumeContext;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.batch.BatchMessageListener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/**
* 延迟消息消费者
*/
@Slf4j
@Component
public class BatchDemoMessageListener implements BatchMessageListener {
@Override
public Action consume(final List<Message> messages, final ConsumeContext context) {
log.info("消费者收到消息大小:"+messages.size());
for (Message message : messages) {
byte[] body = message.getBody();
String s = new String(body);
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatTime = sdf.format(date);
System.out.println("接收到消息时间:"+formatTime);
log.info("接收到消息内容:"+s);
}
try {
//do something..
return Action.CommitMessage;
} catch (Exception e) {
//消费失败
return Action.ReconsumeLater;
}
}
}
5.MQ配置类
import com.aliyun.openservices.ons.api.PropertyKeyConst;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;
@Data
@Configuration
@ConfigurationProperties(prefix = "rocketmq")
public class MqConfig {
private String accessKey;
private String secretKey;
private String nameSrvAddr;
private String topic;
private String groupId;
private String tag;
private String orderTopic;
private String orderGroupId;
private String orderTag;
private String delayTopic;
private String delayGroupId;
private String delayTag;
public Properties getMqPropertie() {
Properties properties = new Properties();
properties.setProperty(PropertyKeyConst.AccessKey, this.accessKey);
properties.setProperty(PropertyKeyConst.SecretKey, this.secretKey);
properties.setProperty(Prope