Java执行器不在JdbcTemplate上工作

Java执行器不在JdbcTemplate上工作,java,multithreading,jdbctemplate,java.util.concurrent,Java,Multithreading,Jdbctemplate,Java.util.concurrent,我试图使用executor对象使用jdbcTemplate执行查询,但由于某些原因,程序没有进入jdbcTemplate内部 ExecutorService executor = Executors.newFixedThreadPool(NUMBER_OF_CONCURRENT_THREADS); executor.execute(new Runnable() { @Override public void run() {

我试图使用executor对象使用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();
            }
        }
    }
ExecutorService executor=Executors.newFixedThreadPool(并发线程的数量);
executor.execute(新的Runnable(){
@凌驾
公开募捐{
inboundJdbcTemplate.query(selectQuery,new RowCallbackHandler()){
@凌驾

public void processRow(ResultSet rs)抛出SQLException{/我找到了问题的解决方案

我需要一个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();
...}
{。。。
ExecutorService executor=Executors.newFixedThreadPool(并发线程的数量);
CompletionService CompletionService=新的执行者CompletionService(执行者);
completionService.submit(新的Runnable(){
@凌驾
公开募捐{
inboundJdbcTemplate.query(selectQuery,new RowCallbackHandler()){
@凌驾
public void processRow(结果集rs)引发SQLException{
试一试{
put(buildDP(rs,Id));
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
}"成功";;
试一试{
Future take1=completionService.take();
字符串s=take1.get();
如果(!“Success”.equals)抛出新的运行时异常(“发生错误”);
捕获(中断异常|执行异常e){
LOG.error(“无法执行数据提取”,e);}
executor.shutdown();
...}

如果删除executor部分(仅jdbctemplate部分),我怀疑您的查询不会返回与SQL标准匹配的结果它工作起来很有魅力。我不认为这是问题所在。然后我怀疑你的程序在executor以新线程运行你的代码之前结束。看看调试器,实际上程序进入executor,直到它运行inboundJdbcTemplate,然后它执行的下一行在executor代码之外。