代码之家  ›  专栏  ›  技术社区  ›  Arya

获取ThreadPoolTaskExecutor的队列大小并在Spring boot中添加到队列

  •  0
  • Arya  · 技术社区  · 5 年前

    我有下面这个类,它有多个自定义 ThreadPoolTaskExecutors 我在这个例子中用一个来展示它。

    @Configuration
    @EnableAsync
    public class ExecutorConfig {
        @Bean(name = "streetCheckerExecutor")
        public Executor getStreetAsyncExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(50);
            executor.setQueueCapacity(1000000);
            executor.setThreadNamePrefix("streetCheckerExecutor-");
            executor.initialize();
            return executor;
        }
    }
    

    我有以下从数据库获取内容的类,我想能够检查 streetCheckerExecutor 如果小于某个数字,则将内容添加到队列中

    @Component
    public class StreetChecker {
    
        @Autowired
        StreetRepository streetRepository;
    
        @Autowired
        StreetCheckService streetChecker;
    
        @EventListener(ApplicationReadyEvent.class)
        public void checkStreets() {
            try {
                List<Street> streetList = streetRepository.getStreets();
    
                for (int i = 0; i < streetList.size(); i++) {
                    streetChecker.run(streetList.get(i));
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                System.out.println("---------------------");
            }
        }
    
    }
    

    下面是工人阶级

    @Component
    public class StreetCheckService {
        @Async("streetCheckerExecutor")
        public void run(Content content) {    
            try {
                //do work
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
    
            }
        }
    }
    

    我正在处理大量数据,我不想每次都从数据库中获取所有数据,但我想检查 StreetcherExecutor公司 如果少于一个数字,我想从数据库中获取更多的内容并将其添加到 StreetcherExecutor公司 魁克

    下面是我的想法,我可以通过转换上面的 checkStreets 到下面那个

    @EventListener(ApplicationReadyEvent.class)
    public void checkStreets() {
        while (true) {
            try {
                // check the queue size of streetCheckerExecutor
                // if less than a number
                // add to the queue
                // else keep waiting and will try again in X minutes
            } catch (Exception e) {
    
            } finally {
                try {
                    Thread.sleep(1000 * 60);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
    

    但是我怎么才能得到 checkStreets() 方法?

    0 回复  |  直到 5 年前
        1
  •  1
  •   Toerktumlare    5 年前

    你可以在你的 ThreadPoolTaskExecutor 去排队 getThreadPoolExecutor().getQueue() .

    @Autowire
    @Qualifier("streetCheckerExecutor")
    private Executor streetExecutor;
    
    @EventListener(ApplicationReadyEvent.class)
    public void checkStreets() {
        while (true) {
            try {
                final BlockingQueue<Runnable> queue = streetExecutor.getThreadPoolExecutor().getQueue();
                if(queue.size() <= 5) {
                    queue.add(() -> {
                         final List<Street> streetList = streetRepository.getStreets();
                         streetList.forEach(street -> {
                             streetChecker.run(street);
                         });
                    });
                }
            } catch (Exception e) {
    
            } finally {
                try {
                    Thread.sleep(1000 * 60);
                } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
    

    我不确定这是你的意思,但也许是这样的。