以activities为例
实现了:
/**
* @author Tom Baeyens
*/
public interface Command <T> {
T execute(CommandContext commandContext);
}
实现类
public class HistoryProcessInstanceDiagramCmd implements Command<InputStream> {
protected String historyProcessInstanceId;
public HistoryProcessInstanceDiagramCmd(String historyProcessInstanceId) {
this.historyProcessInstanceId = historyProcessInstanceId;
}
public InputStream execute(CommandContext commandContext) {
try {
CustomProcessDiagramGenerator customProcessDiagramGenerator = new CustomProcessDiagramGenerator();
return customProcessDiagramGenerator.generateDiagram(historyProcessInstanceId);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
}
如何execute被调用的呢?
Command<InputStream> cmd = new HistoryProcessInstanceDiagramCmd(pid);
InputStream is = ProcessEngines.getDefaultProcessEngine().getManagementService().executeCommand(cmd);
重点在于这个传入的方法cmd,
private final CommandInterceptor first;
@Override
public <T> T execute(CommandConfig config, Command<T> command) {
return first.execute(config, command);
}
之后根据拦截器list加入的顺序走到这步(
activiti源码分析(一)设计模式):其实就是最先传入的cmd自己调用自己的方法
/**
* @author Tom Baeyens
*/
public class CommandInvoker extends AbstractCommandInterceptor {
@Override
public <T> T execute(CommandConfig config, Command<T> command) {
return command.execute(Context.getCommandContext());
}