EJB技术,够重!够杂!

2014-3-19
理论+实践结合篇:
1.EJB3.0(session bean)的搭建
  (注解的形式)
1-1.搭建一个EJB工程
1-2.分析在客户端用户的记录状态?从程序员的角度我们用Stateless(有状态)And Stateful(无状态)。
   这点和JEB2.0没有变化。
1-3.用程序书写session bean以及session bean 的接口实现类,并以注解的形式注入到实现类中,代码如下:

/*session bean*/
package com.lh.ejb.statless;
/**
 * 
 * @author Administrator
 *
 */
public interface MyEjb3 {
    public String working(String name);
}

/*session bean 的实现*/
package com.lh.ejb.statless;
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;
/***
 * 
 * @author Administrator
 *class bean类实现MyEjb3接口,同时实现MyEjb3的方法
 */
@Stateless
//用@Local注入的方式调用本地业务方法
@Local(value={MyEjb3.class})
//用@Remote注入的方式调用远端接口的商务方法。
@Remote(MyEjb3.class)
/*注意:当jobss容器在调用Local本地业务和Remote远端接口的商务方法时,对jobss容器来说是产生
        的一个进程,而local和Remote仅仅只是运行在该进程中的两个线程。但是
*/
public class ImplMyejb3 implements MyEjb3{
    public String working(String name) {
        return name+"从敬业开始....";
        
    }
}

1-4.在jobss容器上发布,并在浏览器端输入http://localhost:8080的链接,找到JMX Console进入
到Jobss下的service=JDNIView,点击进入到Jobss的JMX MBean View,去找List of MBean operations
下的java.lang.String list(),点击invoke,去Global JNDI Namespace找EJB容器中我们定义的信息,
如果没找到就说明我们的注入是有问题或者没有导入jobss-annotations-ejb3.jar包,这是初学者容易
疏忽的一个问题。下面是我的jobss容器发布后在Global JNDI Namespace的信息如下:

  +- ImplMyejb3 (class: org.jnp.interfaces.NamingContext)
  |   +- local (proxy: $Proxy68 implements interface com.lh.ejb.statless.MyEjb3,interface org.jboss.ejb3.JBossProxy)
  |   +- remote (proxy: $Proxy68 implements interface com.lh.ejb.statless.MyEjb3,interface org.jboss.ejb3.JBossProxy)
  +- TopicConnectionFactory (class: org.jboss.naming.LinkRefPair)
  +- jmx (class: org.jnp.interfaces.NamingContext)
  |   +- invoker (class: org.jnp.interfaces.NamingContext)
  |   |   +- RMIAdaptor (proxy: $Proxy47 implements interface org.jboss.jmx.adaptor.rmi.RMIAdaptor,interface org.jboss.jmx.adaptor.rmi.RMIAdaptorExt)
  |   +- rmi (class: org.jnp.interfaces.NamingContext)
  |   |   +- RMIAdaptor[link -> jmx/invoker/RMIAdaptor] (class: javax.naming.LinkRef)
  +- doSomething (proxy: $Proxy58 implements interface com.lh.stataless.StataLessHome,interface javax.ejb.Handle)
  +- HTTPXAConnectionFactory (class: org.jboss.mq.SpyXAConnectionFactory)
  +- ConnectionFactory (class: org.jboss.mq.SpyConnectionFactory)
  +- UserTransactionSessionFactory (proxy: $Proxy15 implements interface org.jboss.tm.usertx.interfaces.UserTransactionSessionFactory)
  +- HTTPConnectionFactory (class: org.jboss.mq.SpyConnectionFactory)
  +- XAConnectionFactory (class: org.jboss.mq.SpyXAConnectionFactory)
  +- TransactionSynchronizationRegistry (class: com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionSynchronizationRegistryImple)
  +- UserTransaction (class: org.jboss.tm.usertx.client.ClientUserTransaction)
  +- UILXAConnectionFactory[link -> XAConnectionFactory] (class: javax.naming.LinkRef)
  +- UIL2XAConnectionFactory[link -> XAConnectionFactory] (class: javax.naming.LinkRef)
  +- queue (class: org.jnp.interfaces.NamingContext)
  |   +- A (class: org.jboss.mq.SpyQueue)
  |   +- testQueue (class: org.jboss.mq.SpyQueue)
  |   +- ex (class: org.jboss.mq.SpyQueue)
  |   +- DLQ (class: org.jboss.mq.SpyQueue)
  |   +- D (class: org.jboss.mq.SpyQueue)
  |   +- C (class: org.jboss.mq.SpyQueue)
  |   +- B (class: org.jboss.mq.SpyQueue)
  +- topic (class: org.jnp.interfaces.NamingContext)
  |   +- testDurableTopic (class: org.jboss.mq.SpyTopic)
  |   +- testTopic (class: org.jboss.mq.SpyTopic)
  |   +- securedTopic (class: org.jboss.mq.SpyTopic)
  +- console (class: org.jnp.interfaces.NamingContext)
  |   +- PluginManager (proxy: $Proxy48 implements interface org.jboss.console.manager.PluginManagerMBean)
  +- UIL2ConnectionFactory[link -> ConnectionFactory] (class: javax.naming.LinkRef)
  +- HiLoKeyGeneratorFactory (class: org.jboss.ejb.plugins.keygenerator.hilo.HiLoKeyGeneratorFactory)
  +- UILConnectionFactory[link -> ConnectionFactory] (class: javax.naming.LinkRef)
  +- QueueConnectionFactory (class: org.jboss.naming.LinkRefPair)
  +- UUIDKeyGeneratorFactory (class: org.jboss.ejb.plugins.keygenerator.uuid.UUIDKeyGeneratorFactory)

2.在做完以上的jobss容器发布后,接下来在来重建一个工程,该工程可以是Java工程,也可以是web工程,
也可以是EJB工程,在这里我们就能很清晰的感觉到EJB容器的重和繁琐了(EJB的缺陷)。下面是我以java工程创建的
代码示例:
2-1.导包,对每一个程序员而言都是老生常谈的事了,所以在这也不例外,需要导入2个jar包。一个是jobssall-client.jar;
另一个是我们上面在jobss容器中发布的EJB工程的接口类的jar包,在这里是一个细节性的问题,我们必须手动导入jar包,但是
jar包里面只要java jvm编译过的.class文件(这篇.class文件是一个或多个interface,而不是interface的实现类)。主要原因
在于安全性(话说白了就是不是每一个公司都具有开源精神的,要不然老板拿什么给员工发工资。这是雯雪的一点直白的认知,
希望能够更加生活化的引导学者们对程序不仅仅要浅学,更要深入)。
2-2.编写Java代码:我们可以用一个测试的类在做测试,代码如下:

package com.lh.ejbclient.test;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import com.lh.ejb.statless.MyEjb3;
public class TestEJB3Main {
    /**
     * @param args
     */
    public static void main(String[] args) {
        Properties props = new Properties();
        props.setProperty("java.naming.factory.initial",
                "org.jnp.interfaces.NamingContextFactory");
        props.setProperty("java.naming.provider.url", "localhost:1099");    
        try {
            InitialContext ctx = new InitialContext(props);
            MyEjb3 remote1 = (MyEjb3) ctx.lookup("ImplMyejb3/remote");
            System.out.println(remote1.working("LeeHong"));;            
        } catch (NamingException e) {
            System.out.println(e.getMessage());
        }
    }
}

2-3.接下来就是让我们的程序运行起来,但是,在运行前,请记住,不要关闭jobss容器,这样
才能感受到EJB技术的跨进程调用的好处。

 运行后的结果:LeeHong 从敬业开始.....

后序,针对于以上所述的理论和代码示例,仅仅只是EJB技术的九牛之一毛,献丑了,望大家多多指导,
相互学习,共同进步。
                                                               
    



   

你可能感兴趣的:(ejb,J2EE)