前几天MSN 和Arbow聊天时,他提到了可以在Cindy的Session接口中加入Object getAttribute(String key)以及void setAttribute(String key, Object value)两个方法,应用会更方便一些。原来的Object getAttachment()和void setAttachment(Object obj)虽然也是这个用途,但是由于只能将设置一个Object对象,用起来多多少少有些不方便,MINA也同时提供了这两种方法来方便应用。
我觉得很有道理,我自己在使用Cindy时也常碰到要关联多个对象到Session,用attachment来做也是有点麻烦,况且加入一个这个的接口并不需要什么时间和技术含量,在AbstractSession中用一个Map来实现就可以了。
但改完Session接口后就发现了一个新问题,加入的Object getAttribute(String)与JMX DynamicMBean中的Object getAttribute(String attribute) throws AttributeNotFoundException,
MBeanException, ReflectionException有冲突。这种事情我还是第一次遇到,基本相同的声明,却有着完全不同的意义,Java语言似乎也没有提供某种机制来解决这种问题。
MBeanException, ReflectionException有冲突。这种事情我还是第一次遇到,基本相同的声明,却有着完全不同的意义,Java语言似乎也没有提供某种机制来解决这种问题。
对于我而言,事情是比较好办的,我可以将Session接口的getAttribute改为getSessionAttribute来解决冲 突。但是如果对于一个应用类要实现两个无法改变的接口,并且接口中有意义不同的重名函数该如何解决呢?当然,这种情况应该是极为罕见。
MINA的运气相对差一点,它的Roadmap中提到要在1.1中才加入JMX的支持,到时发生冲突的概率会很大。不过只要它不返回类似Cindy这样的JmxSession,还是能通过Dynamic MBean来避免的。如:
if ("attribute".equals(attribute)) {
return session.getAttribute();
}
......
}