相关疑难解决方法(0)

使Spring bean的行为类似于ExecutorService的ThreadLocal实例

在我的Web应用程序中,我有一个后台服务.此服务使用Generator类,该类包含Engine类,并ExecutorService配置为使用多个线程并接受GeneratorTasks.

@Component
public class Generator {
    @Autowired
    private Engine heavyEngine;

    private ExecutorService exec = Executors.newFixedThreadPool(3);

    //I actually pass the singleton instance Generator class into the task.
    public void submitTask(TaskModel model, TaskCallback callback) {
        this.exec.submit(new GeneratorTask(model, this, callback));
    }
}

@Component
public class Engine {
    public Engine() {
        //time-consuming initialization code here
    }
}

public class GeneratorTask implements Callable<String> {
    public GeneratorTask(TaskModel m, Generator g, ReceiptCallback c) {
        this.m = m;
        this.generator = g;
        this.c = c;
    }

    public …
Run Code Online (Sandbox Code Playgroud)

java spring multithreading

9
推荐指数
2
解决办法
1万
查看次数

如何将 Spring 事务传播到另一个线程?

也许,我做错了什么,但我找不到以下情况的好方法。

我想对一个在下面使用Spring Batch来执行作业的服务进行单元测试。作业通过AsyncTaskExecutor在单独的线程中预先配置来执行。在我的单元测试中,我想:

  1. 创建少量域对象并通过 DAO 持久化它们
  2. 调用服务方法来启动作业
  3. 等待作业完成
  4. 使用 DAO 检索域对象并检查它们的状态

显然,以上所有内容都应该在一个事务中执行,但不幸的是,事务不会传播到新线程(我理解这背后的基本原理)。

我想到的想法:

  • 在步骤 (1) 之后提交事务 #1。不好,因为数据库状态应该在单元测试后回滚。
  • Isolation.READ_UNCOMMITTED在作业配置中使用。但这需要两种不同的配置用于测试和生产。

java spring multithreading transactions propagation

5
推荐指数
1
解决办法
1万
查看次数

标签 统计

java ×2

multithreading ×2

spring ×2

propagation ×1

transactions ×1