package com.hqyg.disjob.graph; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.jboss.netty.util.internal.ConcurrentHashMap; import com.hqyg.disjob.event.AbstractEventObject; import com.hqyg.disjob.event.ObjectEvent; import com.hqyg.disjob.event.ObjectListener; import com.hqyg.disjob.java.job.DependEJob; public class Scheduler extends AbstractEventObject<Node<DependEJob>> { @SuppressWarnings("rawtypes") private Graph graph ; private Map<Node<DependEJob>, JobCondition> jobConditionsMap = null ; @SuppressWarnings("rawtypes") Scheduler(Graph graph){ this.graph = graph ; } @SuppressWarnings("unchecked") @Override public void attachListener() { jobConditionsMap = new ConcurrentHashMap<Node<DependEJob>, JobCondition>(graph.getVertexSet().size()); Iterator<?> nodes = graph.getVertexSet().iterator(); while(nodes.hasNext()){ Node<DependEJob> node = (Node<DependEJob>) nodes.next(); Set<Node<DependEJob>> reverseNode = (Set<Node<DependEJob>>) graph.getReverseAdjaNode().get(node); jobConditionsMap.put(node,new JobCondition(this,node,reverseNode)); } this.addListener(new ObjectListener<Node<DependEJob>>() { public void onEvent(ObjectEvent<Node<DependEJob>> event) { Node<DependEJob> ejob = event.getValue(); //得到当前这个节点的前驱节点[可能有多个] Set<Node<DependEJob>> dependsNodes = (Set<Node<DependEJob>>) graph.getAdjaNode().get(ejob); if(dependsNodes!=null){ //如果不为null,则向他的后继节点广播一个消息。后继节点都知道自己将收到多少个消息后便可以开始执行 Iterator<?> iter = dependsNodes.iterator(); for(;iter.hasNext();){ Node<DependEJob> temp = (Node<DependEJob>) iter.next(); JobCondition jobCondition = jobConditionsMap.get(temp) ; jobCondition.increMessageCount(ejob);//收到一个消息。进行加一操作。 jobCondition.handler(); } }else{ jobConditionsMap.get(ejob).handler();//如果是最后一个节点每次执行完就直接看消息有没有收足够,收足够了,就执行,没有收足够,就直接丢弃 } } }, 4); } public void notify(Node<DependEJob> node){ ObjectEvent<Node<DependEJob>> objectEvent = new ObjectEvent<Node<DependEJob>>(node, 4); this.notifyListeners(objectEvent); } }