这是开发阿里云的rocketmq的动态注入Bean,增加订阅只需要在配置文件增肌rocket订阅即可(BeanDefinitionRegistry方式指定 初始化和销毁方法)
public class ConsumerClient implements CommandLineRunner/*, BeanFactoryAware*/ {
@Autowired
private MqConfig mqConfig;
@Autowired
private ConfigurableApplicationContext applicationContext;
@Override
public void run(String... args) {
List<String> groupsId = mqConfig.getGroupId();
List<String> topics = mqConfig.getTopic();
List<String> listeners = mqConfig.getListener();
for (int i = 0; i < groupsId.size(); i++) {
MessageListener listener = (MessageListener) applicationContext.getBean(listeners.get(i));
ConsumerBeanCon manualDIBean = registerBean(applicationContext, "consumerBeanCon" + i,
ConsumerBeanCon.class, groupsId.get(i), topics.get(i), listener, mqConfig);
log.info(groupsId.get(i) + "-" + topics.get(i) + "-" + manualDIBean.isStarted());
}
}
public static <T> T registerBean(ConfigurableApplicationContext applicationContext, String name, Class<T> clazz,
Object... args) {
if (applicationContext.containsBean(name)) {
Object bean = applicationContext.getBean(name);
if (bean.getClass().isAssignableFrom(clazz)) {
return (T) bean;
} else {
throw new RuntimeException("BeanName 重复 " + name);
}
}
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
for (Object arg : args) {
beanDefinitionBuilder.addConstructorArgValue(arg);
}
BeanDefinition beanDefinition = beanDefinitionBuilder.getRawBeanDefinition();
beanDefinition.setInitMethodName("start");
beanDefinition.setDestroyMethodName("shutdown");
BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) applicationContext.getBeanFactory();
beanFactory.registerBeanDefinition(name, beanDefinition);
return applicationContext.getBean(name, clazz);
}
@Component
@ConfigurationProperties(prefix = "rocketmq")
@Data
public class MqConfig {
private String accessKey;
private String secretKey;
private String nameSrvAddr;
private List<String> topic;
private List<String> groupId;
private List<String> tag;
private List<String> listener;
private String orderTopic;
private String orderGroupId;
private String orderTag;
public Properties getMqPropertie() {
Properties properties = new Properties();
properties.setProperty(PropertyKeyConst.AccessKey, this.accessKey);
properties.setProperty(PropertyKeyConst.SecretKey, this.secretKey);
properties.setProperty(PropertyKeyConst.NAMESRV_ADDR, this.nameSrvAddr);
return properties;
}
}
public class ConsumerBeanCon extends ConsumerBean {
public ConsumerBeanCon(String groupId, String topic, MessageListener messageListener, MqConfig mqConfig) {
Properties properties = mqConfig.getMqPropertie();
properties.setProperty(PropertyKeyConst.GROUP_ID, groupId);
//将消费者线程数固定为20个 20为默认值
properties.setProperty(PropertyKeyConst.ConsumeThreadNums, "20");
setProperties(properties);
//订阅关系
Map<Subscription, MessageListener> subscriptionTable = new HashMap<>(16);
Subscription subscription = new Subscription();
subscription.setTopic(topic);
// subscription.setExpression(tag);
subscriptionTable.put(subscription, messageListener);
//订阅多个topic如上面设置
setSubscriptionTable(subscriptionTable);
}
}