【问题标题】:Using threads to run a method that is not part of the transaction?使用线程运行不属于事务的方法?
【发布时间】:2010-11-09 08:27:01
【问题描述】:

我有一个案例,在我的 JAVA 应用程序中,我想在事务中调用另一个服务(JMS、WebService、SMS 网关等),我不想依赖调用的结果(成功,失败,抛出异常,...等),所以如果它以某种方式失败,它不会影响我的事务完成,

使用 Spring 框架的最佳方法是什么,

我还想问一下我是否使用线程来处理这个问题,但我的部署将在集群上(即具有不同 JVM 的不同节点),处理(锁定、同步)的最佳方式是什么,

问候,

【问题讨论】:

    标签: java multithreading spring


    【解决方案1】:

    您可以生成一个新线程(最好通过java.util.Executor 或Spring TaskExecutor)来执行辅助任务。 Spring 的事务同步使用不可继承的 ThreadLocal 变量工作,因此新线程不会参与当前事务。

    或者,也许更优雅的是,您可以围绕辅助任务指定显式事务隔离级别,例如:

    @Transactional(propagation=Propagation.NOT_SUPPORTED)
    public void doTheThing() { /.../ }
    

    这将在该方法的持续时间内暂停现有事务,尽管您仍然需要小心运行时异常不会冒泡到您的主事务边界。

    关于您的第二个问题,集群中的锁定和同步是一个非常复杂的主题,我无法用您提供的信息真正回答。我建议为此提出一个新问题,并详细说明您的要求。

    【讨论】:

      【解决方案2】:

      我会将此安排在 quartz 工作中。

      【讨论】:

      • 还要考虑到,我想一调用就运行这个方法
      • 我只是将作业放在石英队列中以进行异步执行。 Spring 与quartz 有很好的集成。当然,如果你还没有在你的应用程序中使用石英,那么仅仅为了这个用例引入它可能是一种矫枉过正。
      • 我已经在使用石英了,但是不确定的是,如果使用它会在某个时候被授予在调用它时将启动作业,那么让作业在短时间内运行会解决这个问题吗?
      • 您可以安排立即触发的作业。 quartz-scheduler.org/docs/api/1.8.0/org/quartz/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      相关资源
      最近更新 更多