tar*_*res 2 java concurrency spring asynchronous spring-mvc
我正在尝试在我的Service类中实现并发方法调用.
我的服务类中有一些注释为@Async的方法,我试图同时调用所有这些方法.但这些方法是按顺序执行的.
这是我的服务类(虚拟):
@Service public class TestService {
public SomeDataType getSOmeDataType() {
try {
List<DataType> a = retrieveDataA().get();
List<DataType> b = retrieveDataB().get();
List<DataType> c = retrieveDataC().get();
List<DataType> d = retrieveDataD().get();
List<DataType> e = retrieveDataE().get();
}
catch (InterruptedException e) {
e.printStackTrace();
}
catch (ExecutionException e) {
e.printStackTrace();
}
return referralDetailsReferenceData;
}
@Async
private Future<List<DataType>> retrieveDataA() {
//method logic
}
@Async
private Future<List<DataType>> retrieveDataB() {
//method logic
}
@Async
private Future<List<DataType>> retrieveDataC() {
//method logic
}
@Async
private Future<List<DataType>> retrieveDataD() {
//method logic
}
@Async
private Future<List<DataType>> retrieveDataE() {
//method logic
}
Run Code Online (Sandbox Code Playgroud)
这是我的春季配置:
<bean id="executorService" class="java.util.concurrent.Executors" factory-method="newFixedThreadPool">
<constructor-arg value="10" />
</bean>
<task:executor id="threadPoolTaskExecutor" pool-size="10" />
<task:annotation-driven executor="executorService" />
Run Code Online (Sandbox Code Playgroud)
执行"getSomeDataType"时,将按顺序调用方法.
我是Spring的@Async和并发执行的新手,所以我确定我做的事情很傻.但我无法弄明白.
任何建议都非常感谢.
seh*_*ope 23
问题是你在内部调用这些方法所以它们没有被代理.对于@Async工作,您需要从应用程序上下文中检索对象,并在检索到的副本上调用方法.在内部调用它将无法正常工作.
如果您尝试调用内部@Transactional方法,则会发生同样的情况.见注:部分在结束春节文档说明@Transactional的详细信息.
此外,你马上打电话的方式.get()对Future返回值不正确.如果您希望它们并行发生,您应该提交所有任务,然后通过检索每个任务.get().
通常的方法是处理代理问题是创建一个单独的服务类,它被TestService注入其中并@Async直接调用服务方法:
@Service public class TestServiceHelper {
@Autowired
TestService testService;
public SomeDataType getSOmeDataType() {
try {
// Invoke all of them async:
Future<List<DataType>> a = testService.retrieveDataA();
Future<List<DataType>> b = testService.retrieveDataA();
Future<List<DataType>> c = testService.retrieveDataA();
Future<List<DataType>> d = testService.retrieveDataA();
Future<List<DataType>> e = testService.retrieveDataA();
// Wait for each sequentially:
List<DataType> aList = a.get();
List<DataType> bList = b.get();
List<DataType> cList = c.get();
List<DataType> dList = d.get();
List<DataType> eList = e.get();
// do work with lists here ...
}
catch (InterruptedException e) {
e.printStackTrace();
}
catch (ExecutionException e) {
e.printStackTrace();
}
return referralDetailsReferenceData;
}
}
Run Code Online (Sandbox Code Playgroud)
上面单独的服务bean(非常hackish /不推荐!)的替代方法是将对象注入其自身并使用注入的副本来调用@Async方法.
| 归档时间: |
|
| 查看次数: |
9981 次 |
| 最近记录: |