利用EjbProxy

利用EjbProxy 数据挖掘研究院

调用远程EJB的一个简单有效的class

数据挖掘交友

摘要: 数据挖掘交友

这个技巧告诉你如何利用EjbProxy,它提供了一些事例,调用远程EJB并不是直接与你的代码接合执行一个特殊的EJB

By Gorsen Huang

Translator Biggie 数据挖掘交友

 

数据挖掘实验室

如果你经常采用EJB开发,你或许从客户机程序那里写代码访问EJB或者写代码访问其它EJB。通常情况下,执行这些代码仅需要一些很少的变化。一个好的程序员大多数情况下处理这个问题用拷贝和贴切。然而,拷贝和贴切几次后,它会变得让人烦燥。 那就是为什么我决定开发一个class让它帮我去做,我把它叫EjbProxy,用它使得代码保持干净和整洁,这个类在调用任何EJB都不需要知道EJBjndi name,并且可以在客户端或是EJB里使用它。

数据挖掘交友

 

你必须遵循4种基本的措施来调用EJB 数据挖掘实验室

1.             创建一个jndi上下文(initial context

2.             在上下文中查找EJB name (look up the EJB name in context)

3.             取得EJB对像 数据挖掘研究院

4.             通过home对像的create()方法创建EJB实例对像 数据挖掘交友

1-3步具体实施如下: 数据挖掘实验室

InitialContext ctx = new InitialContext (prop);
    Object home = ctx.lookup(beanName);
    EJBHome obHome =
      (EJBHome) PortableRemoteObject.narrow (home, EJBHome.class); 数据挖掘研究院

 

如你所见,你得到一个EJB name Object不需要知道具体的执行细节,除用jndi查找以外。

数据挖掘论坛

4步不是简单易懂的,当你试图用home对像去创建一个EJB 对像的时候,一旦EJBHome 接口没有定义create()方法时,你就不能通过home 对象调用create() 方法,只是实际上执行EJB实现这个方法。

 

作为一个可行的解决方法,你可以定义一个接口去继承EJB home并且声名create()方法,然后你可以简单的用home对像的这个接口并且访问create()方法。然而,这种方法有一个缺点:它需要所有的EJB实现这个接口,从任意的home接口中,调用你想调用的create()方法。

数据挖掘工具

 

数据挖掘实验室

一个更好的解决方法是你可以使用java的反射能力(关于反射API的详细资料请参考Resources)利用reflection (反射)API你可以用Class.forname方法加载指定的class,然后访问getDeclaredMethod()方法重新声明class,你能用Method.invoke 执行这种方法。 数据挖掘论坛

 

以下代码是使用反射从home对像中获得EJB的实例对像: 数据挖掘交友

Method m = obHome.getClass().getDeclaredMethod("create", new Class[0]);
Object objRemote = m.invoke (obHome, new Object[0]);
Object obj = PortableRemoteObject.narrow(objRemote, theClass);

 

即,这段程序片断是从home对像中得到class,并且通过访问getDeclaredMethod()create()方法名称获得create"s Method对像。此外用invoke()方法执行create方法,返回EJB的实例对像。 数据挖掘交友

The EjbProxy class 数据挖掘交友

EjbProxy class,源代码EjbProxy.java,为你处理这些令人讨厌的细节。 数据挖掘交友

 

数据挖掘论坛

EjbProxy相当简单,首先创建一个EjbProxy对像,你可以传递参数,例如用initial context 工厂 provider URL去创建initial context对像。然后访问getObj()方法用jndi查找EJB获得EJB实例对像。注意,当你从一个EJB调用另一个EJB涉及到名称时,你可能需要填加lookup name的一个环境字符串,例如java.comp/env/. 数据挖掘交友

  数据挖掘工具

例子程序download 它将显示给你如何用EjbProxy去调用一个EJB。测试目的,我同样执行一个EJB,名字叫EjbProxyExample,它有一个pulbic 方法 数据挖掘交友

 

public String hello (String name) throws RemoteException; 数据挖掘研究院

 

这个方法传入一个名称字符串并且返回一个hello组成的字符串变量,EjbProxy的jndi名称例子如下:com.javaworldtip.ejbproxyexample.EjbProxyExample,假设你用weblogic在本地的7001端口去构造和发布EJB, EjbProxyExample,客户端代码: 数据挖掘交友

  数据挖掘实验室

EjbProxy myproxy = new EjbProxy ("weblogic.jndi.WLInitialContextFactory",
                                 "t3://localhost:7001");
EjbProxyExample obj = (EjbProxyExample)myproxy.getObj
("com.javaworldtip.ejbproxyexample.EjbProxyExample");
//now get "Hello, World!" string and show it
String strHello = obj.hello("World");
System.out.println (strHello);
数据挖掘论坛

 

数据挖掘交友

如果你用这个EJB调用同一服务器内部的另一个EJB的话,代码如下:

 

EjbProxy myproxy = new EbjProxy ();
EjbProxyExample obj = (EjbProxyExample)myproxy.getObj
("com.javaworldtip.ejbproxyexample.EjbProxyExample ");

 

数据挖掘研究院

如果你已经在部署文件中指定了EjbProxyExample,你就可以直接用getObj()方法: 数据挖掘论坛

EjbProxyExample obj =
      (EjbProxyExample) myproxy.getObj ("java:comp/env/EjbProxyExmaple");

How it works(它是如何工作的)

数据挖掘论坛

你可以扩展构造器或setContextProperties()方法;

数据挖掘研究院

public void setContextProperties (String initContextFactory,
                                  String providerUrl,
                                  String user,

数据挖掘工具


                                  String password)
    {
        _prop = new Properties (); 数据挖掘论坛
        _prop.put (Context.INITIAL_CONTEXT_FACTORY, initContextFactory);
        _prop.put (Context.PROVIDER_URL, providerUrl);
        if (user != null)
        {
            _prop.put(Context.SECURITY_PRINCIPAL, user);
            if (password == null)

数据挖掘论坛


                        password = "";
            _prop.put(Context.SECURITY_CREDENTIALS, password);
        } 数据挖掘论坛
    }

所有的参数都是创建initContext的环境,包括initcontext工厂,provider URL,用户名,密码,如果你用这个类在同一容器中重新得到EJB,你可以简单的传入null或是干脆不用理睬他们。

数据挖掘实验室

 

数据挖掘论坛

现在,让我们看一看在我们的代理类中的重要方法,getObj() 数据挖掘研究院

public Object getObj (String beanJndiLookupName) throws EJBException
    {
        try
        { 数据挖掘实验室
            EJBHome obHome = getHome (beanJndiLookupName);
            //get the method of create
            Method m = obHome.getClass().getDeclaredMethod("create", new Class[0]); 数据挖掘实验室
            //invoke the create method
            Object obj = m.invoke (obHome, new Object[0]);
            return obj;


        }
        catch (NoSuchMethodException ne)
        {

数据挖掘交友


            throw new EJBException (ne);
        }
        catch (InvocationTargetException ie) 数据挖掘交友
        {
            throw new EJBException (ie);
        } 数据挖掘研究院
        catch (IllegalAccessException iae)
        {
            throw new EJBException (iae); 数据挖掘交友
        }
    }

getObj()方法里,唯一需要的参数就是EJB查找的jndi name,这个方法首先调用了一个gethome()方法来获得EJBhome对像,然后调用getDeclaredMethod()方法获得create方法。一旦create被捕获,你就可以调用它并取得EJB的实例对像,如果发生意外的话,将抛出一个异常。 数据挖掘实验室

 

数据挖掘工具

你必须处理一些可能发生的异常,例如:如果EJB没有声名create方法,方法getDeclaredMethod()将抛出NoSuchMethodException异常,在这段程序中,各种各样的捕捉将通过创建新的EJBException来处理这些可能发生的异常,这个方法,程序调用getObj()方法必须抛出EJBException并且适当的处理。 数据挖掘论坛

  数据挖掘研究院

以下那些在getOjb()方法的getHome()方法代码如下:

public EJBHome getHome (String beanJndiLookupName) throws EJBException
    {
        try
        { 数据挖掘交友
              InitialContext ctx = null;

              if (_prop != null)
                        ctx = new InitialContext (_prop);

数据挖掘研究院


                else
                        ctx = new InitialContext ();

            Object home = ctx.lookup(beanJndiLookupName); 数据挖掘研究院
            EJBHome obHome = (EJBHome)PortableRemoteObject.narrow (home, EJBHome.class);
            return obHome;
        }
        catch (NamingException ne)
        {
            throw new EJBException (ne); 数据挖掘研究院
        }
    } 数据挖掘研究院

这个方法简单的限制了第一步到第三步调用EJB方法,我用getHome()方法正确得到我想要的home对像。I.e你想得到EJB对像,并且迟些后调用它的方法(例如调用create方法创建一个session bean) 数据挖掘交友

 

数据挖掘研究院

Extend EjbProxy

数据挖掘研究院

针对一些情况,你可能想继承EjbProxy,例如:假设EJB’s create()方法没有任何输入参数,你可以简单的通过继承这个类用getObj去处理大多数情况: 数据挖掘交友

public Object getObj (String beanJNDILookupName, Class[] classes, Object[]
objects) throws EJBException;

数据挖掘工具

在方法内部,当调用getDeclaredMethod() 和invoke()方法应用额外参数:

数据挖掘研究院

 

数据挖掘实验室

Method m = obHome.getClass().getDeclaredMethod("create", classes);
Object obj = m.invoke (obHome, objects);

数据挖掘论坛

 

你可以通过扩展这个类去执行任意EJB方法: 数据挖掘实验室

public Object executeMethod (String methodName, Class[] classes, Object[]
objects) throws EJBException;

methodName

[数据挖掘专家] [数据挖掘研究院] [数据挖掘论坛] [数据挖掘实验室]
上一篇:WebService开发中对象数据类型的交换
下一篇:J2EE和XML开发——用户接口(二)
最新评论共有 0 位网友发表了评论 , 查看所有评论
发表评论( 不能超过250字,需审核,请自觉遵守互联网相关政策法规。 )
匿名?
数据挖掘网站导航 数据挖掘论坛导航
  • 数据挖掘工具
  • 数据挖掘论坛
  • DataCruncher - Cognos
  • MineSet - MathSoft
  • Intelligent Miner - GainSmarts
  • Sqlserver - SAS - Clementine
  • CART - Weka - WizSoft
  • NeuroShell - ModelQuest
  • data mining tools - Darwin
  • 数据挖掘交友
  • 数据挖掘博客
  • 数据挖掘工具
  • 数据挖掘资源
  • 数据挖掘技术算法
  • 数据挖掘相关期刊、会议
  • 研究院联盟合作专区
  • 数据挖掘基础与相关技术
  • 数据挖掘厂商与就业
  • 数据挖掘研究者乐园
  • 知名厂商数据挖掘工具资料
  • 国内数据挖掘实验室
  • Foreign Data Mining Lab
  • 热点关注
  • 尚学堂J2EE和MLDN的J2EE视频教程哦
  • 有谁知道ERROR:JDWP Unable to get
  • com.microsoft.sqlserver.jdbc.SQLServerEx
  • 急~Eclipse3.3语言包,VEP插件
  • 毕业5年了,大家一个月全部收入能拿多少(税
  • org.hibernate.exception.ConstraintViolat
  • hibernate抛出could not fetch initial val
  • hibernate left outer join 出错 Path expe
  • myeclipse5.1.0和myeclipse6.0有什么区别。
  • spring如何动态获取bean,如何动态调用getB
  • 论坛最新话题
  • Foundations of Statistical Natural Langu
  • Game Theory meet Data Mining: A Recent P
  • System Building: How does it help or hin
  • 数据挖掘与Clementine培训
  • 新手报到
  • 求 SASEM 客户流失预测分析
  • 数据挖掘工程师/搜索研究院—北京——无线
  • 数据挖掘入门介绍(如何着手数据挖掘)
  • Information Overload Survey Results
  • The INEX 2005 Workshop on Element Retrie
  • 相关资讯
  • 不安装jre能运行JAVA程序吗?
  • Java的模板引擎Velocity用户手册
  • 成为java高手的八大条件
  • 简化Java代码的技巧
  • JAVA的网络功能与编程
  • 用java读取各种计算机文件系统的文件列表
  • 怎样拿下SUN公司的SCJP认证?
  • Borland以全额现金交易收购VMGEAR
  • 用JNI技术提高Java的性能
  • 用Java编写HTML文件分析程序
  • 数据挖掘实验室资料
  • 数据挖掘博客地址
  • 数据挖掘实验室网站地址
  • Prepare for Medicare audits by using dat
  • 注册成为SAS用户与爱好者俱乐部会员
  • 水南梅
  • 明日烟
  • 新人报道
  • 下载
  • 厦门服务器托管,450元/月—0592-5177319 高
  • 买空间送域名--0592-5177319 高静