Java Executor无法处理JdbcTemplate

时间:2013-05-10 20:00:46

标签: java multithreading jdbctemplate java.util.concurrent

我正在尝试使用执行程序对象使用jdbcTemplate执行查询,但由于某种原因,程序不会进入jdbcTemplate。

        ExecutorService executor = Executors.newFixedThreadPool(NUMBER_OF_CONCURRENT_THREADS);
        executor.execute(new Runnable() {
        @Override
        public void run() {
            inboundJdbcTemplate.query(selectQuery, new RowCallbackHandler() {
                @Override
                public void processRow(ResultSet rs) throws SQLException {//<-instruction pointer never goes to this line
                    try {
                        //buffer.put(buildDataPoint(rs, testPermutationId));
                        System.out.println(rs.getString(0));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                        Thread.currentThread().interrupt();
                    }
                }
            });
            try {
                buffer.put(STOPPING_TOKEN);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

任何人都可以帮我解决这个愚蠢的错误吗?

1 个答案:

答案 0 :(得分:0)

我找到了问题的解决方案。

我需要一个CompletionService,以确保我知道JdbcTemplate的执行何时完成。

{...
 ExecutorService executor = Executors.newFixedThreadPool(NUMBER_OF_CONCURRENT_THREADS);
 CompletionService<String> completionService = new ExecutorCompletionService (executor);

 completionService.submit(new Runnable() {
    @Override
    public void run() {
        inboundJdbcTemplate.query(selectQuery, new RowCallbackHandler() {
            @Override
            public void processRow(ResultSet rs) throws SQLException {
                try {
                    buffer.put(buildDP(rs, Id));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
 }, "Success");

 try{
      Future<String> take1 = completionService.take();
      String s = take1.get();
      if(!"Success".equals(s)) throw new RuntimeException("Error Occured");
 catch (InterruptedException | ExecutionException e) {
        LOG.error(" Could not execute DataExtraction",e);}
 executor.shutdown();
...}