java - 如何为所有请求 RestController 使用一个类的单个实例
问题描述
我有一个名为 PriorityJobScheduler 的类,在 RestControll 中,我只想为所有请求创建它的对象,因为我在 @PostConstruct 方法中实例化了这个类,但是对于每个新请求,我都会得到一个新对象。
我想知道如何仅将此类实例化一次并将其对象用于所有请求。
public class PriorityJobScheduler {
Logger log = LoggerFactory.getLogger(PriorityJobScheduler.class);
private ExecutorService priorityJobPoolExecutor;
private ExecutorService priorityJobScheduler =
Executors.newSingleThreadExecutor();
private PriorityBlockingQueue<DowloadProccess> priorityQueue;
public PriorityJobScheduler(Integer poolSize, Integer queueSize) {
Comparator<DowloadProccess> priorityComparator = Comparator.comparingInt(DowloadProccess::getJobPriority).reversed();
priorityJobPoolExecutor = Executors.newFixedThreadPool(poolSize);
priorityQueue = new PriorityBlockingQueue<DowloadProccess>(queueSize, priorityComparator);
priorityJobScheduler.execute(() -> {
while (true) {
try {
log.debug(priorityQueue.take().toString());
priorityJobPoolExecutor.execute(priorityQueue.take());
} catch (InterruptedException e) {
break;
}
}
});
}
public void scheduleJob(DowloadProccess job) {
priorityQueue.add(job);
log.debug("Jobs in queu :: " + priorityQueue.size());
}
}
我的控制器
@RestController
public class ZcrController {
private static int POOL_SIZE = 1;
private static int QUEUE_SIZE = 100;
PriorityJobScheduler pjs;
@PostConstruct
public void init() {
pjs = new PriorityJobScheduler(POOL_SIZE, QUEUE_SIZE);
}
@GetMapping("/zcr/run")
public List<Map<String,Object>> exicuteCRTask(@RequestParam(required = false) String agentId,@RequestParam(required = false) String callCenterId,
@RequestParam(required = false) String clientId,@RequestParam(required = false) String skillId,
@RequestParam(required = false) String interval,@RequestParam("callRecordingId") String callRecordingId,@RequestParam(required = false) String type, @RequestParam(required = false) String customReport,@RequestParam(required = false) boolean ivrAcd,
@RequestParam(required = false) String endDate, @RequestParam(required = false) String startDate,
@RequestParam(required = false) String startTime, @RequestParam(required = false) String endTime) {
ITxn txn = new TxnToken();
List<Map<String,Object>> listCDRDetail = dao.getIvrRecords(txn, params,dbParam,type);
log.debug("CDR bean size::" +listCDRDetail.size());
// Here I am passing of instance of that class.
// And on each new request i am getting a new instance pjs.
taskExecutor.runZcrJob(pjs, dbParam, listCDRDetail, type, txn);
return listCDRDetail;
}
解决方案
您可以在 Spring 容器中创建 bean
@Configuration
class JobSchedulerConfig {
private static int POOL_SIZE = 1;
private static int QUEUE_SIZE = 100;
@Bean
public PriorityJobScheduler createJobScheduler() {
return new PriorityJobScheduler(POOL_SIZE, QUEUE_SIZE);
}
}
然后在 Rest Controller 中注入这个 bean。
@RestController
public class ZcrController {
private final PriorityJobScheduler priorityJobScheduler;
@Autowired // kept it for readability
public ZcrController(PriorityJobScheduler priorityJobScheduler) {
this.priorityJobScheduler = priorityJobScheduler;
}
...
}
推荐阅读
- php - 使用 .htaccess 删除 .php 扩展名会重复我的页面吗?
- ios - 如何使用 UITableView 在列表中创建列表
- python - 将列表从 pandas 列附加到 python 列表
- c# - Xamarin Android 将小部件工具栏图标向右对齐
- django - Django filter queryset __in exact matching
- python - 数据框列 str 替换为列表
- latex - 未在 toc 中的参考文献后的附录和缺少图形标签
- ios - 在 Swift 4 中使用 KeyEnumerators
- javascript - 我可以将 DOM 节点从 iFrame 移动到父母的正文吗?
- python - NameError:名称“click_entry”未定义(Python)