【问题标题】:Why is my thread blocking on call to service method为什么我的线程在调用服务方法时阻塞
【发布时间】:2021-08-12 20:08:03
【问题描述】:

我的线程和服务类:

public class InterfaceThread implements Runnable {

    private static final Logger logger = Logger.getLogger(InterfaceThread.class);

    @Autowired
    private ScanService scanService;
    
    @Override
    public void run() {
        String accessToken = getAccessTokenFromJSON(getResponse(null, URL_UPDATE_ACCESS_TOKEN, METHOD_POST).getText());
        logger.debugv("Access Token Found {0}", accessToken);
        
        String pendingOrdersJson = getResponse(accessToken, URL_PENDING_ORDERS, METHOD_GET).getText();
        logger.infov("Pending Orders {0}", pendingOrdersJson);

        String singleOrderJson = getResponse(accessToken, String.format(URL_SINGLE_ORDER, "3353246000022471593"), METHOD_GET).getText();
        logger.infov("Single Order {0}", singleOrderJson);
        
        doProcess(accessToken);
    }
    
    private void doProcess(String accessToken) {
        // read tblScan for any records that have an order number and serial number that are not completed sent and not 5 tries
        // loop through serialNumbers and find a detail record and update it

        System.out.println("getting List");
        List<Scan> scans = scanService.listReadyForTransmission();
        System.out.println(Arrays.toString(scans.toArray()));
        for (Scan scan : scans) {
            processScan(accessToken, scan);
        }
    }
}
    
@Service
public class ScanServiceImpl implements ScanService {

    @Autowired 
    ScanDao scanDao;
    
    @Override
    @Transactional
    public List<Scan> listReadyForTransmission() {
        System.out.println("Calling the dao for list");
        return scanDao.listReadyForTransmission();
    }
}

我的日志:

14:42:08 INFO [pool-5-thread-1]:web.InterfaceThread.run()72 - Pending Orders {Returned JSON}
14:42:09 INFO [pool-5-thread-1]:web.InterfaceThread.run()75 - Single Order {Returned JSON}
getting List

所以你可以从日志中看到 Pending Orders 有效,Single Order 有效,然后进入“getting list”,后面应该紧跟着“Calling the dao for list”,但是线程被阻塞了.为什么会这样,我该如何阻止它?

【问题讨论】:

  • 然后就什么都没有了?异常/错误/超时/等?
  • @Eugene 正确

标签: java spring multithreading


【解决方案1】:

您很可能会陷入处理 @Transactional 注释的任何拦截器中。

要调试它,我建议使用 JDK 附带的the jstack utility(与java 在同一目录中);它将转储所有正在运行的线程的堆栈跟踪,因此您可以看到该线程挂起的位置。

【讨论】:

  • 好吧,我试过那个 jstack,但找不到我的线程。我也无法从垃圾场中找出正面或反面。您的评论使我搜索“java线程调用@Transactional”,但我发现了这个stackoverflow.com/questions/11275471/…。我更改了线程调用 (ScheduledExecutorService) 以匹配 OP (TaskScheduler) 并遵循主要答案并且它有效。
猜你喜欢
  • 2013-10-31
  • 2020-08-06
  • 2021-10-19
  • 2016-01-11
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 2017-04-14
相关资源
最近更新 更多