我需要使用Spring创建一个异步过程,但是当我将@Async
放在我的方法上时,我会收到此错误
java.io.NotSerializableException: org.springframework.aop.interceptor.AsyncExecutionInterceptor
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
我有这个例子,但它不起作用:
@Autowired
private IServicioClienteAsync servicioClienteAsync;
public void prueba() {
//testAsync();
servicioClienteAsync.crearCliente();
}
和
@Service(value = "servicioClienteAsync")
public class ServicioClienteAsync implements Serializable, IServicioClienteAsync {
@Autowired
private WServiceCliente wServiceCliente;
@Override
public void crearCliente() {
wServiceCliente.test("wiiii");
}
}
和
@Component
public class WServiceCliente{
@Async
public void test(String name) {
System.out.println("init ");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("finish");
}
}
答案 0 :(得分:0)
是否因为WServiceCliente
服务Serializable
bean使用Serializable
时ServicioClienteAsync
不是{{1}}?
答案 1 :(得分:0)
为了支持@Async
注释的语义,Spring需要附加AsyncExecutionInterceptor
来拦截对方法的调用,并指定一个Executor
来执行其代码。我猜测AsyncExecutionInterceptor
本身不是可序列化的,因为它包含对Executor
的引用,它不太可能是可序列化的,否则开发人员根本就没有计划将其序列化。
典型的Executor
实现将引用一个或多个Thread
实例来执行 - 而Thread
(就像包装OS级别句柄或类似构造的任何其他内容一样)不可序列化有充分理由;在这种情况下,即使AsyncExecutionInterceptor
是可序列化的,序列化也会在参考图上进一步失败。
答案 2 :(得分:0)
使用默认配置,我在executor bean的配置中使用@EnableAsync(mode = AdviceMode.ASPECTJ)并解决了问题。