使用线程运行不属于事务的方法?

时间:2010-11-09 08:27:02

标签: java multithreading spring

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

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

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

此致

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:0)

我会在quartz工作中安排这个。