博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EJB技术,够重!够杂!
阅读量:6504 次
发布时间:2019-06-24

本文共 5503 字,大约阅读时间需要 18 分钟。

hot3.png

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技术的九牛之一毛,献丑了,望大家多多指导,

相互学习,共同进步。
                                                               
    
   

转载于:https://my.oschina.net/win199176/blog/209688

你可能感兴趣的文章
python常用模块
查看>>
pycharm快捷键
查看>>
postfix疯狂外发垃圾邮件之分析与解决(上)
查看>>
Bootstrap Table的 文本内容 垂直居中
查看>>
遍历文件下所有文件
查看>>
php自定义json_encode()和json_decode()函数
查看>>
进程的创建
查看>>
mysql高可用
查看>>
软件管理
查看>>
机器学习概述
查看>>
ID、句柄、指针、对象互相转换
查看>>
杭电3790--最短路径问题(双权Dijkstra)
查看>>
HDU-2087-剪花布条
查看>>
elr_memory_pool详解
查看>>
考试题解集合
查看>>
MySQL配置文件my.cnf优化详解
查看>>
day5时间复杂度
查看>>
rpm的含义
查看>>
微信公众平台开发文摘
查看>>
shiro中的<shiro:principal />标签的使用
查看>>