1

我需要用 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");
  }
}
4

3 回答 3

0

使用默认配置,我在执行程序 bean 的配置中使用 @EnableAsync(mode=AdviceMode.ASPECTJ) 并解决了问题。

于 2013-08-16T03:41:06.513 回答
0

为了支持@Async注解的语义,Spring 需要附加一个AsyncExecutionInterceptor来拦截对方法的调用,并指定一个Executor执行其代码的对象。我猜它AsyncExecutionInterceptor本身不是可序列化的,仅仅是因为它持有对Executor不太可能可序列化的 an 的引用,或者开发人员根本不打算对其进行序列化。

一个典型的Executor实现将引用一个或多个Thread要在其上执行的实例——并且Thread(就像任何其他包装 OS 级句柄或类似结构的东西一样)是不可序列化的,这是有充分理由的;在这种情况下,即使AsyncExecutionInterceptor是可序列化的,序列化也会沿着参考图进一步失败。

于 2013-05-30T22:16:20.433 回答
0

是因为您的服务beanWServiceCliente没有Serializable使用您的服务吗?SerializableServicioClienteAsync

于 2013-05-30T21:59:13.510 回答