@Async - 在完成任务之前在Spring独立线程关闭

时间:2013-09-11 07:46:52

标签: spring asynchronous

我有一个要求,我在GUI上做一些操作,一旦我将数据保存在DB中,我需要向Web服务发送一个http请求。但是对GUI的响应不应该等待来自webservice请求的结果。 为此我使用@Async,Spring的注释。 这是我的结构

MyConroller.java 

调用方法

goSaveAndCreate

中的

(非异步)

ServiceA.java

ServiceA 在其中注入了 ServiceB bean。一种方法,

@Async
create() 
ServiceB 中的

使用Async进行批注。 现在,ServiceA.goSaveAndCreate调用一个方法,保存并调用ServiceB.create()(即Async)。 我可以在日志中看到创建了一个正在执行create方法的新线程。但是在一个特定的点停止之后突然记录下来并且该线程似乎已经被杀死或被打乱了。

 @Service("MarginCalculationService")
 public class ServiceA implements ServiceAI {
private static final String APPROVED = "APPROVED";

public static final String SUCCESS = "SUCCESS";
....
@Autowired
ServiceB serviceB;

public List<VV> goSaveAndCreate(String[] ids,List<XX> calList) throws Exception, DataAccessException {
        try {
            Pair<List<VG>,List<UU>> resultList = save(ids);
            vvList  = resultList.getFirst();
            /*
             * HKAPIL - Send Message to webService callingserviceB
             */
            if(resultList.getSecond() != null){
                serviceB.create(resultList.getSecond());
            }
        } catch (DataAccessException e) {
            e.printStackTrace();
            logger.error("Data Access Exception thrown during - " , e);
            throw e;
        } catch (Exception e){
            e.printStackTrace();
            logger.error("Exception thrown during " , e);
            throw e;
        }
        System.out.println("Exiting the method in MCSERVICE");
        return vvList;

}

   private save(){
    ...
    ...
   }
}

第二次服务

 @Service("wireInstructionMessageService")
 public class ServiceB implements ServiceBI {
 @Async 
    @Override
    public void create(List<Ralc> calcList) {
        String threadName = Thread.currentThread().getName();
    logger.info("Inside a different thread [" + threadName + " ] to send message ." );
    ..
    ...
    otherMethod(Obj);
    }

    private otherMethod(Obj obj){
    ...
    ...
    ..

    //tills this point logs are getting printed  nothing after this
    ..
    ...
    }

}

applciationContext.xml条目

<!--  Defines a ThreadPoolTaskExecutor instance with configurable pool size, queue-capacity, keep-alive, 
      and rejection-policy values. The id becomes the default thread name prefix -->
<task:executor id="MyMessageExecutor"
pool-size="5-25"
queue-capacity="100"/>

<task:annotation-driven executor="MyMessageExecutor"/>

现在我有两个问题

1)有没有办法可以在某些方法中添加一些日志,告诉我来自MyExecutor的新线程被杀死或MyExecutor被关闭(我们在普通Java ExecutorSerrvice中的方式) 2)我是否以错误的方式使用Asyn?是否有可能一旦方法从Controller或ServiceA返回,ServiceB实例也会被清除?

由于 HKapil

0 个答案:

没有答案