2010年11月3日
这里LZ再做最后一次冲刺,如果能找到线索,就继续,找不到,就找华生。
今天问了Leader,To be Cruel
因为populateMap作用域是private,所以它只能在本地被调用。
我们看看都有谁调用了它!
1, public void setProcessMap(Map map) {
processMap.clear();
populateMap(map, processMap);
}
2, public void setDiscardMap(Map map) {
discardMap.clear();
populateMap(map, discardMap);
}
从前面大家知道这个populateMap是将它的第一个参数里面值传给它第二个参数里面的Map里面。
我们的线索就是我们的数据传到了哪里,我们就找哪里。
现在传到了Map里,那我们就找Map看谁和它有联系。
有三个方法和processMap有关系:
1,public List getProcessDestinations(IMessageProcessor processor) {
List l = (List) processMap.get(processor);
return l != null ? l : Collections.EMPTY_LIST;
}
注意它返回的是一个list,它将传进来的参数作为key,然后返回一个MessageProcessor的List。
2, protected IMessageProcessor getIfAlreadyAutoboxed(Object processor){
Object boxed = null;
Iterator ite = processMap.keySet().iterator();
while(ite.hasNext()){
Object key = ite.next();
if(! (key instanceof Node)) continue;
Node node = (Node) key;
if(node.getProcessor().equals(processor)){
boxed = node;
break;
}
}
return (IMessageProcessor) boxed;
}
作用是得到如果已经封装过了。
得到processMap的key集合,然后迭代,如果key是Node(第一次出场)的实例,就继续下一次迭代,否则
将key(强制)转化为Node。如果node.getProcessor()==processor,那就把node赋值给boxed。中断迭代
。返回的是一个IMessageProcessor。
3, public Object clone() throws CloneNotSupportedException {
RoutingMap obj = (RoutingMap) super.clone();
obj.processors = Collections.unmodifiableSet(processors);
obj.processMap = Collections.unmodifiableMap(processMap);
obj.discardMap = Collections.unmodifiableMap(discardMap);
obj.exceptionMap = Collections.unmodifiableMap(exceptionMap);
return obj;
}
这个先不详细描述了
我们可以试着把重点放在第一个方法上,选中第一个方法,CTRL+ALT+H
发现出现了一个新的view,call hierarchy.
一共有4个调用。
先看第一个方法 在新类TopologyAnalyser中
private void buildTopology(IRoutingMap map) {
topology=new HashMap();
Collection processors=map.getMessageProcessors();
Iterator it=processors.iterator();
//Get the direct connections
while (it.hasNext()) {
IMessageProcessor processor=(IMessageProcessor)it.next();
link(processor,map.getProcessDestinations(processor));
link(processor,map.getDiscardDestinations(processor));
}
//Now get the indirect ones
it=processors.iterator();
}
调用了RoutingMap里面的
public Collection getMessageProcessors() {
return Collections.unmodifiableCollection(processors);
}
这里面的
Collections.unmodifiableCollection返回指定 collection 的不可修改视图,此方法允许模块为用户提
供对内部 collection 的“只读”访问。在返回的 collection 上执行的查询操作将“读完”指定的
collection。试图修改返回的 collection(不管是直接修改还是通过其迭代器进行修改)将导致抛出
UnsupportedOperationException
processors值是xml传来的所有的IMessageProcessor。
迭代出所有的IMessageProcessor,
根据提供的IMessageProcessor key得到value List<IMessageProcessor>。
link(processor,map.getProcessDestinations(processor));将源处理器和目标处理器连接起来。
查找link()的源
private void link(IMessageProcessor src,List destinations) {
TopologyInfo srcTi=getTopologyInfo(src);
srcTi.addOutputs(destinations);
Iterator it=destinations.iterator();
while(it.hasNext()) {
IMessageProcessor destination=(IMessageProcessor)it.next();
TopologyInfo dstTi=getTopologyInfo(destination);
dstTi.addInput(src);
}
}
TopololyInfo 是类TopologyAnalyser中一个内部类,作用就是得到输入和输出,并将输入和输出
的IMessageProcessor放入list中。
class TopologyInfo {
private List inputs=new ArrayList();
private List outputs=new ArrayList();
public List getInputs() {
return inputs;
}
public List getOutputs(){return outputs;}
public void addInput(IMessageProcessor input) {
inputs.add(input);
}
public void addOutput(IMessageProcessor output) {outputs.add(output);}
//public void addInputs(Collection inputs) {this.inputs.addAll(inputs);}
public void addOutputs(Collection outputs) {this.outputs.addAll(outputs);}
}
我们再回头看link()的源,将目的处理器给了srcTi的outputs List.源处理器给了inputs List。
在这里源和目的终于连接上了。
那么这个类TopologyAnalyser,在link()中要初始化,
首先调用
private TopologyInfo getTopologyInfo(IMessageProcessor processor) {
TopologyInfo topologyInfo;
if (!topology.containsKey(processor)) {
topologyInfo=new TopologyInfo();
topology.put(processor, topologyInfo);
}
else {
topologyInfo=(TopologyInfo)topology.get(processor);
}
return topologyInfo;
}
如果在Map topology中包含源IMessageProcessor,则将topology中的目标IMessageProcessor放
入topologyInfo中,如果不包含IMessageProcessor,则创建一个新的TopologyInfo实例,然后将空
的topologyInfo和源ImessageProcessor一起放入topology Map。返回topologyInfo.
posted @
2010-11-03 13:54 Vigoss 阅读(177) |
评论 (0) |
编辑 收藏