1.driver-event-pd.xml
<?xml version="1.0" encoding="utf-8"?>
<config>
<value>{"name":"driver_event","namesrvAddr":"test-rq01-a.mq.01zhuanche.com:9876", "group":"driverEventGroup", "instanceName":"driverEventInstance", "retryTimesWhenSendFailed": 3, "sendMsgTimeout":3000}</value>
</config>
2. TopicEnum
public enum TopicEnum implements ITopic {
DRIVER_EVENT_TOPIC( "driver-event-pd", "RecodeTraceQueue"),
ROB_NOTICE_TOPIC( "rob-notice-pd","robNotice"),
;
private String configName ;
private String topic;
TopicEnum(String configName, String topic) {
this. configName = configName;
this. topic = topic;
}
@Override
public String configKey() { return configName; }
@Override
public String topicName() { return topic; }
}
3.WarmupProcess
@Service
public class WarmupProcess implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
if(event.getApplicationContext().getParent()!=null){
return;
}
ApplicationContext context = event.getApplicationContext();
for(MongoEnum mongo : MongoEnum.values()){
mongo.get().warmup();
}
for(TopicEnum topic : TopicEnum.values()){
topic.get().warmup();
}
for(DispatcherRedisEnum redis : DispatcherRedisEnum.values()){
redis.get().warmup();
}
Map<String, HikariDatasourceWrap> datasources = context.getBeansOfType(HikariDatasourceWrap.class);
if(CollectionUtils.isNotEmpty(datasources.values())){
for (HikariDatasourceWrap datasourceWrap : datasources.values()) {
datasourceWrap.warmup();
}
}
JvmManager.start();
}
}
4.ITopic
public interface ITopic {
ConcurrentHashMap<ITopic, RocketMqProductorWrap> valueCache = new ConcurrentHashMap<>();
String configKey();
String topicName();
default RocketMqProductorWrap get() {
RocketMqProductorWrap productor = valueCache.computeIfAbsent(this, RocketMqProductorWrap::new);
return productor;
}
}
5.RocketMqProductorWrap
public class RocketMqProductorWrap implements RockectMqProductor {
private Logger logger = LoggerFactory.getLogger(RocketMqProductorWrap.class);
private static final AtomicInteger PRODUCT_SEQ = new AtomicInteger();
private static final int DEFAULT_RETRY_TIMES_WHEN_SEND_FAILED = 3;
private static final int DEFAULT_SEND_MSG_TIMEOUT = 2 * 1000;
private final BaseNodeResource<DefaultMQProducer> producerNode;
private final String configKey;
private final String topic;
private final Consumer<RocketMqProductorWrap> failCallback; //鍗犳椂娌℃湁鐢紝鍥炲ご鎵╁睍寮傛鏂规硶鏃朵娇鐢�
public RocketMqProductorWrap(String configKey, String topic) {
this(configKey, topic, null);
}
public RocketMqProductorWrap(ITopic itopic) {
this(itopic.configKey(), itopic.topicName(), null);
}
public RocketMqProductorWrap(String configKey, String topic, Consumer<RocketMqProductorWrap> failCallback) {
this.configKey = configKey;
this.topic = topic;
this.failCallback = failCallback;
this.producerNode = BaseNodeResource.<DefaultMQProducer>newBuilder()
.withKey(configKey)
.withFactory(this::initProductor)
.withCleanupConsumer(this::cleanup)
.withWaitStopPeriod(1000) //鍏抽棴鑰佺殑productor鍓嶏紝鍏堢瓑1000ms锛岀瓑寰呮棫鏁版嵁鍙戦�佸畬鎴愩��
.addFactoryFailedListener(this::factoryFailListenner)
.build();
}
private DefaultMQProducer initProductor(String content) {
try {
RocketProductorConfig config = RocketProductorConfig.from(content);
checkParam(config);
DefaultMQProducer productor = new DefaultMQProducer();
//澧炲姞搴忓垪鍙凤紝闃叉鐢变簬杩涚▼涓璯roupName鎴栬&#