有关service controller

我想在app server端通过一种配置的方式实现动态的服务加载,想法如下:
ServiceController是一个stateless session bean,他有一个方法public Object process(Command pCommand),pCommand可以看作是一个参数集合,包含我希望请求的服务,通过这个pCommand,ServiceController 可以查到希望调用的类以及他的方法并通过动态加载的方式把这个类载如虚拟机并调用他相应的方法。这个类可能是一个ejb的client, 也可能本身就包含了业务逻辑的处理。现在的问题是通过什么方式我才能把pCommand中的属性和具体的类及方法对应起来,如果ServiceController是在web server这一端,很容易实现,我可以通过一个xml配置文件,把pCommand中的属性和类的全名以及方法名一一映射。但是现在我的这个ServiceController是一个无状态session bean,我该如何做?我可以在ejb-jar.xml 中通过下面这样的配置来指定希望加载的类。

[env-entry]
[env-entry-name]TestClient[/env-entry-name]
[env-entry-type]java.lang.String[/env-entry-type]
[env-entry-value]test.ejb.TestClient[/env-entry-value]
[/env-entry]

但是要想具体指定到类的方法该如何做?
我的服务器是jboss2.4.6。

classloader只能定位到一个具体类的load吧,怎么具体指定到类的方法?关注。。

我是打算先那到class,然后在通过reflection 来拿到他的方法,实现方式基本上是这样的:

Class[] parameterClasses = new Class[1];
parameterClasses[0] = Class.forName("javax.servlet.http.HttpServletRequest");
XXClass xxClass = new XXClass();
Method method = null;
method = xxClass.getClass().getMethod(methodName, parameterClasses);
Object[] parameters = new Object[1];
parameters[0] = request;
// invoke the method
method.invoke(xxClass, parameters);

你可以定义一个service controller的接口,接口中有一个方法比如:handle(),这样需要使用某个具体service时,你册程序只需要和这个接口打交道,直接操作接口的方法。

可能是 service controller 的叫法容易引起一些误解,其实我现在还没定下来具体怎么定义这个名字,或许叫 service dispatch ? 不管叫什么,我的想法是 service controller 是一个比较纯粹的 stateless session,他根据传入的参数去动态的加载class并调用该class的方法,每个被加载进来的class可以看作是一个服务。这样的话,如果需求变化时,可以通过修改配置文件来修改服务的内容而不需要修改接口。

之所以希望把这个 service controller 放在 app server 这一端,是我想客户端可能会是web browser, stand along application, j2me 等等各种各样不同的类型,如果他们希望与服务端交互的话,只需指明要求的 “服务类型”,“服务类型的方法”,“参数”这3项最基本的要素就成。但是现在我找不到一个合理的把“服务类型”,“服务类型的方法”,“参数”的标示与具体的class,method,parameter name 对应起来的方式。

各位觉得呢?

那你能不能用编号?
比如123 代表 service1

如果需要和具体方法联系起来,在123下定义子编码?

我也这么想过,在[env-entry-value]里放置全部的配置信息,但我同时还想利用XML来表示配置信息,所以只有用<和>来表示左右尖括号,具体类似下面的方式:
<test><aaa>aaa</aaa><bbb>bbb</bbb></test>

看起来有些不爽吧?不过终究是一种实现的方式,可以通过这样的配置信息来实现方法级的配置,但这样是否丧失了ejb container的优势?因为ejb在app server启动时是会被载入内存的,正是通过object pool的方式来实现性能的提高,但如果我每次都是利用RTTI 的方式来加载并调用服务的话,性能肯定是会降低的,或许可以自己再实现一套CACHE 的机制,但是 REFLECTION 也无法被 CACHE, 呵呵,我现在真是有点儿乱了。