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技术的九牛之一毛,献丑了,望大家多多指导,
相互学习,共同进步。