Spring @Async注释导致java.io.NotSerializableException?

时间:2013-05-30 21:50:31

标签: spring serialization asynchronous

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

3 个答案:

答案 0 :(得分:0)

是否因为WServiceCliente服务Serializable bean使用SerializableServicioClienteAsync不是{{1}}?

答案 1 :(得分:0)

为了支持@Async注释的语义,Spring需要附加AsyncExecutionInterceptor来拦截对方法的调用,并指定一个Executor来执行其代码。我猜测AsyncExecutionInterceptor本身不是可序列化的,因为它包含对Executor的引用,它不太可能是可序列化的,否则开发人员根本就没有计划将其序列化。

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

答案 2 :(得分:0)

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