gpt4 book ai didi

Java Spring bean 创建另一个 bean 的更多实例

转载 作者:行者123 更新时间:2023-12-02 12:01:59 25 4
gpt4 key购买 nike

我有这样的情况:

@RestController
@RequestMapping("/api")
public class A {

@Autowired
private B b;

@RequestMapping(value = "/exec", method = RequestMethod.GET)
public void execute(){
int i = 0;
for (i; i < 10; i++;){
b.execute(i);
}
}

@RequestMapping(value = "/exec/{i}", method = RequestMethod.GET)
public void executeSingle(@PathVariable int i) {
b.execute(i);
}
}

@Service
public class B{
public void execute(int i){
//...a long time...
}
}

现在我调用A的方法execute(),需要很长时间,因为它连续调用B.execute()。

我想要一种并行的方法。

我将创建 bean B 的多个实例并同时调用它们,因此我可以获得实际“循环解决方案”所花费时间的约 9/10。

我怎样才能做到这一点?

现在为了获得这些改进,我通过浏览器使用多个 HTTP GET 调用 A 的 10 次方法executeSingle(int i),例如:

获取地址/api/exec/1

获取地址/api/exec/2

获取地址/api/exec/3

...

但我想使用更优雅的解决方案。

最佳答案

我想说你需要使用ExecutorService特别是ThreadPoolExecutor阅读它们以了解如何使用它。然后我将对您的代码进行以下更改:更改您的 B 类以实现 Runnable。

    public class B implements Runnable {
private int myParam;

public void setMyParam(int i) {
myParam = i;
}

public void run() {
execute(myParam)
}

private void execute(int i) {
...
}
}

现在不要将其设置为 bean,也不要将其注入(inject)到您的 A 类中。但是创建一个 BclassFactory 类来创建并返回一个 B 类(或者只是在每次需要时创建一个新的 B 类。现在将 ThreadPoolExecutor 的实例注入(inject)到您的 A 类中,并在您的执行方法中执行如下操作:

   @RequestMapping(value = "/exec", method = RequestMethod.GET)
public void execute(){
int i = 0;
for (i; i < 10; i++;){
B b = factory.getB();
b.setMyParameter(i);
executor.submit(b);
}
}

这应该可以解决问题

关于Java Spring bean 创建另一个 bean 的更多实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47184996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com