当前位置: 首页 > 面试题库 >

从另一个线程(可运行)调用@Transactional方法

乐正心水
2023-03-14
问题内容

有没有简单的解决方案,可以在新线程中使用JPA将数据保存到数据库中?

我基于Spring的Web应用程序允许用户管理计划的任务。在运行时,他可以创建和启动预定义任务的新实例。我正在使用spring的TaskScheduler,并且一切正常。

但是我需要将每个被激发任务的布尔结果保存到数据库中。我怎样才能做到这一点?

编辑:我必须概括我的问题:我需要从任务在我的@Service类上调用方法。因为在保存到数据库之前必须对任务结果进行“处理”。

编辑2:我有问题的代码的简化版本在这里。从调度程序调用saveTaskResult()时,将打印出消息,但没有任何内容保存到db中。但是,每当我从控制器调用saveTaskResult()时,记录都将正确保存到数据库中。

@Service
public class DemoService {

    @Autowired
    private TaskResultDao taskResultDao;

    @Autowired
    private TaskScheduler scheduler;

    public void scheduleNewTask() {
        scheduler.scheduleWithFixedDelay(new Runnable() {

            public void run() {
                // do some action here
                saveTaskResult(new TaskResult("result"));
            }

        }, 1000L);
    }

    @Transactional
    public void saveTaskResult(TaskResult result) {
        System.out.println("saving task result");
        taskResultDao.persist(result);
    }

}

问题答案:

代码的问题在于,您希望在调用时启动事务saveTaskResult()。这不会发生,因为Spring使用AOP来启动和停止事务。

如果您从bean工厂获得事务性Spring
bean的实例,或者通过依赖注入,则实际上得到的是bean周围的代理。该代理在调用实际方法之前启动事务,并在方法完成后提交或回滚事务。

在这种情况下,无需调用事务代理即可调用bean的本地方法。将saveTaskResult()方法(带有注释@Transactional)放入另一个Spring
bean。将另一个Spring bean注入DemoService,然后从DemoService调用另一个Spring bean,一切都会好起来的。



 类似资料:
  • 问题内容: 我在Service类中看到了一种被标记为的方法,但是它也在同一类中调用了其他未标为的方法。 这是否意味着对单独方法的调用导致应用程序打开与DB的单独连接或暂停父事务等? 不带任何注释的方法的默认行为是什么,而另一个带有注释的方法调用该方法的默认行为是什么? 问题答案: 当你调用没有事务块之内的方法时,父事务将继续使用新方法。它将使用与父方法(with )相同的连接,以及在调用的方法中导

  • 我试图用一个自定义对象创建一个新线程,然后从主线程调用这个自定义对象方法。其思想是,主线程可以继续执行其他任务,而自定义对象可以继续在第二个线程中工作: 输出为: 它应该更像这样: 所以主线程被阻塞,直到方法完成。主线程是否在第二个线程中等待完成(作为返回类型为空,我认为情况不会如此)?还是在第一个线程中执行,因此阻塞了它? 我知道使用下面的代码,我可以在另一个线程中执行,但它每次都会从头开始创建

  • 问题内容: 在Spring中,带有注释的方法 将获得一个新的事务(如果还没有),但是我注意到,如果从非事务处理方法调用事务方法,则不会获得任何事务。这是代码。 是一个常规方法,该方法调用是事务性的,但不会保留任何更改。 我正在使用Spring 3和Hibernate3。在这里我做错了什么?谢谢。 问题答案: 这是Springs AOP的局限性之一。因为dao bean实际上是在spring时创建的

  • 在一个android服务中,我创建了用于执行一些后台任务的线程。 我遇到一个情况,线程需要在主线程的消息队列上发布特定任务,例如。 有没有方法获取主线程的并从我的另一个线程向它发布/?

  • 问题内容: 我的一项活动遇到了一个奇怪的问题。从拍照/录像回来时,我正在显示一个对话框,允许用户命名相机。用户按下“确定”后,我将使用所请求的文件名发送给主题,该主题将复制文件(并显示进度对话框)。 由于某种原因,即使我调用,总是在主线程上调用执行复制的函数。 更改呼叫以解决问题。我还是想知道为什么它不起作用… 问题答案: 并且是那里最混乱的运营商。前者确保订阅副作用在指定的调度程序(线程)上发生