我正在使用BlockingQueue将元素从提供程序传递给使用者,并且工作正常。
要在发生异常时回滚数据库操作,我将注释@Transactional(rollbackFor = Exception.class)添加到提供程序函数。出乎意料的是,这阻止了使用者从队列中读取任何元素。
提供者总是可以成功地将元素放入队列,但是使用者永远不能从队列中取出元素。
删除@Transactional批注,或将元素放入@Transactional标记方法之外的队列中,均可解决此问题。
这是Java伪代码
blockingQueue = new BlockingQueue();
// consumer code
while (true) {
// take a element
blockingQueue.take();
}
// provider code
// after removing the annotation the consumer works fine
@Transactional(rollbackFor = Exception.class)
provideElement() {
// put a element
blockingQueue.put();
}
我通过将put方法移出@Transactional代码段来解决此问题。但是我仍然很好奇:为什么添加@Trasactional注释会阻止使用者从阻塞队列中获取元素?