1. 参考
https://blog.csdn.net/qq_41813208/article/details/103650592
https://www.cnblogs.com/jpfss/p/9453794.html
https://blog.csdn.net/qdh186/article/details/104451292/
SpringUtil
package com.xxx.xxx.boot.utils;
import java.util.Map;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public SpringUtil() {
}
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringUtil.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static <T> T getBean(String name) throws BeansException {
return applicationContext.getBean(name);
}
public static <T> T getBean(Class<?> clz) throws BeansException {
return applicationContext.getBean(clz);
}
public static <T> Map<String, T> getBeansOfType(Class<T> clz) throws BeansException {
return applicationContext.getBeansOfType(clz);
}
}
HelloWorld helloWorld=(HelloWorld)ctx.getBean("id名称");
HelloWorld helloWorld=(HelloWorld)ctx.getBean("类型名.class");
2. 项目代码
RedisDelayQueueHandler
public interface RedisDelayQueueHandler<T> {
/**
* 执行方法
* @param t
*/
void execute(T t);
}
RedisDelayQueueHandler redisDelayQueueHandler = SpringUtil.getBean(queueEnum.getBeanId());
redisDelayQueueHandler.execute(value);
WorkOrderResponseTimeoutHandler
@Component
@Slf4j
public class WorkOrderResponseTimeoutHandler implements RedisDelayQueueHandler<Long> {
@Override
public void execute(Long workOrderId) {
// XXX
}
}
WorkOrderServiceTimeoutHandler
@Component
@Slf4j
public class WorkOrderServiceTimeoutHandler implements RedisDelayQueueHandler<Long> {
@Override
public void execute(Long workOrderId) {
// XXX
}
}
RedisDelayQueueEnum
package com.XXX.device.util.delay.queue;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
/**
* 延迟队列业务枚举
*
* @author 20007485
* @date 2023/4/12 11:07
*/
@Getter
@AllArgsConstructor
@NoArgsConstructor
public enum RedisDelayQueueEnum {
/**
* 工单响应超时预警
*/
WORK_ORDER_RESPONSE_TIMEOUT_WARNING("WORK_ORDER_RESPONSE_TIMEOUT_WARNING","工单响应超时预警", "workOrderResponseTimeoutHandler"),
/**
* 工单服务超时预警
*/
WORK_ORDER_SERVICE_TIMEOUT_WARNING("WORK_ORDER_SERVICE_TIMEOUT_WARNING", "工单服务超时预警", "workOrderServiceTimeoutHandler");
/**
* 延迟队列 Redis Key
*/
private String code;
/**
* 中文描述
*/
private String name;
/**
* 延迟队列具体业务实现的 Bean
* 可通过 Spring 的上下文获取
*/
private String beanId;
}
3. 总结
beanName的生成规则如下:
1.当类的首字母和第二个字母都是大写时,返回类的原值,这里应该写成config.getBean(“XPersonService”)。
2.默认的情况下是将类的首字母小写,其余的字母不变。
WorkOrderResponseTimeoutHandler.class --> "workOrderResponseTimeoutHandler"
WorkOrderServiceTimeoutHandler.class --> "workOrderServiceTimeoutHandler"