Spring的事件机制由3部分组成,一个事件类,一个监听器类,一个发布事件的源头,下面就以一个具体的实例看看这3部分的写法
1、事件类,这个类需要实现ApplicationEvent接口,具体代码如下:
import org.springframework.context.ApplicationEvent;
public class SubtaskFinishEvent extends ApplicationEvent {
/**
*
*/
private static final long serialVersionUID = 1L;
private Object obj;
public SubtaskFinishEvent(Object obj) {
// TODO Auto-generated constructor stub
super(obj);
this.obj = obj;
}
public Object getObj() {
return obj;
}
}
2、监听器类,这个类需要实现ApplicationListener接口,具体代码如下:
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
@SuppressWarnings("rawtypes")
public class SubtaskFinishListener implements ApplicationListener {
@Autowired
IParticipantSubtaskDao psubtaskdao;
@Autowired
IDrillTaskExDao drilltaskexdao;
@SuppressWarnings("unchecked")
@Override
public void onApplicationEvent(ApplicationEvent event) {
// TODO Auto-generated method stub
if (event instanceof SubtaskFinishEvent) {
//do something
}
}
}
3、事件源头,即发布事件
public class ResultServiceImpl implements IResultService, ApplicationContextAware {
private ApplicationContext applicationContext;
private static Log logger = LogFactory.getLog(DrillTaskServiceImpl.class);
@Override
@POST
@Path("/submitResult")
@Consumes("application/json;charset=UTF-8")
public ResultDto submitResult(ResultSubmitPageDto dto) {
// TODO Auto-generated method stub
ResultDto ret = null;
IResultMethod m = null;
try {
m = (IResultMethod)Class.forName(jlist.get(0).getClassName()).newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
logger.error("submitResult judge : " + e.getMessage(), e);
ret = ResultBuilder.buildResult(ResultBuilder.FAIL_CODE, null, ErrorCode.SERVER_COM_CLASS2OBJECTFAIL);
return ret;
}
String retjudge = m.judge(dto);
if (retjudge.equals("-1")) {
logger.error("submitResult judge method execute error!!!!");
ret = ResultBuilder.buildResult(ResultBuilder.FAIL_CODE, null, ErrorCode.SERVER_DRILLRESULT_EXECUTEFAIL);
return ret;
} else if (retjudge.equals("1")) {
this.applicationContext.publishEvent(new SubtaskFinishEvent(dto));
}
ret = ResultBuilder.buildResult(ResultBuilder.SUCC_CODE, retdto, null);
return ret;
}
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
// TODO Auto-generated method stub
this.applicationContext = applicationContext;
}
}
最后我们的application文件中,需要加入监听类的bean,如下:
<bean id="SubtaskFinishListener" class="com.bjhit.eranges.listener.SubtaskFinishListener" />