Spring非同步執行(@Async)2點注意事項

小雷FansUnion發表於2015-10-22

  Spring中可以非同步執行程式碼,註解方式是使用@Async註解。

  原理、怎麼使用,就不說了。


  寫2點自己遇到過的問題。

1.方法是公有的

  // 通知歸屬人
@Async
public void notifyPusher(Project project) {

     

      }


2.非同步程式碼,需要放在外部單獨的類中。

   @Service("asyncBiz")
public class AsyncBiz {

    

@Async
public void notifyPusher(Project project) {

     

       }


 據說這是一個“常識”,外部方法才會被Spring攔截器攔截到額。


程式碼呼叫示例

@Service
public class ProjectServiceImpl implements ProjectService{

public void audit(long id, short status) {
		
			if(project.getPusher() != null){
				AsyncBiz asyncBiz = SpringContextUtil.asyncBiz();
				asyncBiz.notifyPusher(project);
				asyncBiz.notifyCare(project);
			}
		
	}

}


一個工具類

@Component
public class SpringContextUtil implements ApplicationContextAware{

	private static ApplicationContext ctx;
	@Override
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		this.ctx = applicationContext;		
	}
	
	public static ApplicationContext getCtx(){
		return ctx;
	}
	
	public static Object getBean(String name) throws BeansException { 
        return ctx.getBean(name); 
	} 
	
	public static AsyncBiz asyncBiz() throws BeansException { 
        return (AsyncBiz) ctx.getBean("asyncBiz"); 
	} 

}

可以靈活手動獲得Spring容器中的bean,也可以很好地解決迴圈依賴問題。


相關文章