Tengo una clase denominada PriorityJobScheduler y en RestControll quiero crear su objeto solo una vez para todas las solicitudes para las que estoy instanciando esta clase en el método @PostConstruct pero para cada nueva solicitud obtengo un nuevo objeto.
Quiero saber cómo puedo instanciar esta clase solo una vez y usar su objeto para todas las solicitudes.
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()); }}
mi controlador
@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; }Puedes crear el bean en el contenedor Spring
@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); } }Y luego inyecte este bean en el controlador de descanso.
@RestController public class ZcrController { private final PriorityJobScheduler priorityJobScheduler; @Autowired // kept it for readability public ZcrController(PriorityJobScheduler priorityJobScheduler) { this.priorityJobScheduler = priorityJobScheduler; } ... }