JBoss除了提供MBean服务这种方式将任意的功能集成进来以外,还提供了分离调用的功能.它能将MBean的功能接口通过任意的协议供客户端远程访问.分离调用器的意义:远程访问以及访问服务的协议是一个相对于组件独立的服务.也就是说,可以将名称服务通过RMI/JRMP 或RMI/HTTP等任意的传输协议来进行访问.
分离调用器的架构
客户端这边有一个客户端代理,它提供MBean服务的动态代理接口,与EJB代理不同的是:解释器在代理里面而不是外面,客户端通过某种查找机制(比如JNDI)得到代理对象.
传输层的选择是由客户端代理的最后一个解释器(调用解释器)决定,调用解释器获得与传输协议相关的存根对象,这个存根对象对应服务器端分离MBean服务的分离调用器.调用解释器同时也会对同一个虚拟机中的调用的目标MBean进行一些优化.当调用解释器发现这种情况,这个调用会被转交给一个通过引用调用的调用器,这个调用器仅仅是将调用转交给目标MBean来进行.
分离调用器服务的功能即:通过分离调用器所能处理的任何协议,都能进行分离的调用操作.
invoke接口如下:
package org.jboss.invocation;
import java.rmi.Remote;
import org.jboss.proxy.Interceptor;
import org.jboss.util.id.GUID;
public interface Invoker
extends Remote
{
/**
* A globaly unique identifier use to determine if an instance is local
* to the invoker.
*/
GUID ID = new GUID();
/**
* A free form String identifier for this delegate invoker, can be clustered or target node
* This should evolve in a more advanced meta-inf object
*/
String getServerHostName() throws Exception;
/**
* The invoke with an Invocation Object.
*
* <p>
* the delegate can handle network protocols on behalf of proxies (proxies delegate to these
* puppies). We provide default implemenations with JRMP/Local/Clustered invokers.
* The delegates are not tied to a type of invocation (EJB or generic RMI).
*
* @param invocation A pointer to the invocation object
* @return Return value of method invocation.
*
* @throws Exception Failed to invoke method.
*/
Object invoke(Invocation invocation) throws Exception;
}
分离调用器的作用相当于一个传输网关,能够基于特定的协议接受org.jboss.invocation.Invocation对象形式的调用请求,将请求对象序列化,然后转给目标MBean服务进行调用,再将返回值或异常返回给客户端.
Invocation对象是一个方法调用的上下文信息对象,包含了目标MBean的名称,方法以及方法的参数,有代理工厂产生的代理相关的上下文信息,以及客户端代理解释器进行方法调用时所需的参数.
客户端代理的配置是通过服务器端的代理工厂这个MBean来完成,代理工厂执行的任务如下:
1 创建一个动态代理,实现将要提供给客户端访问的MBean服务接口
2 将动态代理的句柄与客户端解释器进行关联
3 将代理绑定到JNDI中供客户端访问
通过指定的接口访问MBean服务的步骤如下:
1 定义一个匹配JMX操作声明的方法:public Object invoke(org.jboss.invocation.Invocation)throw Exception
2 使用org.jboss.invocation.MarshalledInvocation.calculateHash方法,创建从提供接口java.lang.reflect.methods到长散列值对象Hashmap<long,Method>映射
3 实现invoke方法,使用这个接口方法的散列映射,将被调用方法的长散列映射转为公开接口java.lang.reflect.methods通过反射机制来调用开放接口的MBean服务相关的对象