ejb3.0 remote local

随着Spring的兴起,EJB2.0被彻底击败,但是EJB3.0却痛定思痛,总结经验教训以一个崭新的面貌问世,而他究竟怎么,能否以流行的敏捷性开发框架抗衡,这里我们可以先了解一下他,然后再来下定论,下面就开始吧:
软件环境:
IDE:Eclipse 3.2
jdk1.5.0
Application Server:jboss-4.2.0.CR1
JBoss Eclipse IDE: JBossIDE-2.0.0.Beta2-ALL.zip
EJB3.0

 

后三项都可以在 http://www.jboss.com/downloads/index 中下载。下载完成后,下面就开始吧:
(一)环境设置
1. 将jboss-4.2.0.CR1解压释放,我的目录是D:\Java\jboss-4.2.0.CR1
2. 环境变量添加 JBOSS_HOME,指向该目录
3. 解压释放JBossIDE-2.0.0.Beta2-ALL.zip,将plugins和features目录下的文件拷贝到eclipse的
目录下,删除原始eclipse\configuration的文件全部删除(除了config.ini文件),重新启动eclipse,
点击Window-->Preferences,如果能够看到图一,和图二中的东东,那么JBoss Eclipse IDE,就安装成
功了。图二蓝色标注的部分是JBoss Rule的东西,不是本文讨论的内容,所以不用管他。
4. 点击图二红色标注的部分,New-->New Server-->JBoss Inc-->JBoss AS 4.0, 点击Next, 点击Home按钮指向JBoss的安装目录,这里我的是D:\Java\jboss-4.2.0.CR1,然后为这个server取一个名字
jboss-4.2.0.CR1,Configuration选择default,点击default,名字还是叫做jboss-4.2.0.CR1,然后点击finish。到此为止全部环境已经设置好了。
(二)建立工程
1. File-->New-->Other-->EJB3.0-->EJB3.0 Project,取一个名字Ejb3Tutorial,点击Next按钮,选择刚才安装JBoss AS jboss-4.2.0.CR1,点击Finish。这时一个EJB3.0的工程就建好了。但是发现有一个错误,打开Window-->Show view-->Problems,打开透视图以后发现这个错误
Project Ejb3Tutorial is missing required library: 'D:\Java\jboss-4.2.0.CR1\server\default\deploy\ejb3.deployer\jboss-ejb3x.jar'
这时右键打开工程属性,Properties-->Java Build Path-->Libraries,打开JBoss EJB3 Libraries[default],
发现确实有一个librariy有警告,错误信息很明显,就是missing 。这时在%JBOSS_HOME%\client可以找到这个librariy,把他拷贝到D:\Java\jboss-4.2.0.CR1\server\default\deploy目录下,然后refresh一下,此时错误信息就没有了,一切准备就绪。
2. 我们的这一个例子以JBoss提供的教程来实现,一共3个接口,一个实现类,还有一个cilent。代码如下:

Java代码
  1. public interface Calculator {  
  2.     int add(int x, int y);  
  3.   
  4.     int subtract(int x, int y);  
  5. }  
  6.   
  7. @Local  
  8. public interface CalculatorLocal extends Calculator  
  9. {  
  10. }  
  11.   
  12. @Remote  
  13. public interface CalculatorRemote extends Calculator  
  14. {  
  15. }  
  16.   
  17. @Stateless  
  18. public class CalculatorBean implements CalculatorRemote, CalculatorLocal {  
  19.     public int add(int x, int y) {  
  20.         return x + y;  
  21.     }  
  22.   
  23.     public int subtract(int x, int y) {  
  24.         return x - y;  
  25.     }  
  26. }  
  27.   
  28. public class Client {  
  29.     public static void main(String[] args) throws Exception {  
  30.         InitialContext ctx = new InitialContext();  
  31.         Calculator calculator = (Calculator) ctx.lookup("CalculatorBean/remote");  
  32.         System.out.println("1 + 1 = " + calculator.add(11));  
  33.         System.out.println("1 - 1 = " + calculator.subtract(11));  
  34.     }  
  35. }  
public interface Calculator {int add(int x, int y);int subtract(int x, int y);}@Localpublic interface CalculatorLocal extends Calculator{}@Remotepublic interface CalculatorRemote extends Calculator{}@Statelesspublic class CalculatorBean implements CalculatorRemote, CalculatorLocal {public int add(int x, int y) {return x + y;}public int subtract(int x, int y) {return x - y;}}public class Client {public static void main(String[] args) throws Exception {InitialContext ctx = new InitialContext();Calculator calculator = (Calculator) ctx.lookup("CalculatorBean/remote");System.out.println("1 + 1 = " + calculator.add(1, 1));System.out.println("1 - 1 = " + calculator.subtract(1, 1));}}

很简单是吧?哦,也许吧。
第一种方式:也就是上述代码那样,CalculatorLocal被@Local标注,以说明他是一个本地接口而CalculatorRemote被@Remote标注,说明他是一个远程接口。而CalculatorBean被@Stateless标注,并实现了上述接口,说明他是实现了上述接口的无状态会话bean。这种做法是JBoss推荐的,也是我个人比较喜欢的,从接口一眼就可以看出这个接口是为本地还是远程所提供服务的。

 

第二种方式:分别删除这两个接口的@Local和@Remote标注,然后在CalculatorBean加注@Local
({CalculatorLocal.class})和@Remote ({CalculatorRemote.class})。

第三种方式:和以前的EJB,删除全部标注,写部署文件ejb-jar.xml。

哈哈,真是萝卜白菜各有所爱嘛。
这里顺便提及一下JNDI绑定的问题:
The Calculator bean will have two JNDI bindings for the remote and Local interface. By default, JBoss will use ejbName/local and ejbName/remote for the local and remote interfaces, respectively.
从Client的代码可以看出,Client就正是采用了JBoss这种默认的绑定方法,而我们也可以实现自己的绑定,这也很简单,用@LocalBinding和@RemoteBinding这两个标注就可以了。如上,如果我们在Calculator bean上标注@LocalBinding(jndiBinding="myFirst/Local")和@RemoteBinding(jndiBinding="myFirst/Remote")的话,那么客户端调用就应该相应的改为ctx.lookup("myFirst/Local")和ctx.lookup("myFirst/Remote")了。
(三). 编译,运行
好了,到此所有工作都已经完成了,编译运行吧。这里由于JBoss 可以热部署EJB3.0,所以先启动服务。这里可以到%JBOSS_HOME%\bin 下执行run命令,也可以在eclipse中,Window-->Show view-->Servers, 选中我们建立的jboss-4.2.0.CR1,然后右键start启动JBoss AS.
在这个例子中,有一个build.xml文件,我们进入这个项目的文件路径下,我的是D:\workspace\Ejb3Tutorial,然后执行ant run命令,可以成功看到:
run:
     [java] 1 + 1 = 2
     [java] 1 - 1 = 0
这就算成功了,因为ant run命令首先将我们的代码编译并打包到%JBOSS_HOME%\server\default\deploy目录下,然后执行Client的调用。当然我们也可以在eclipse中执行,右键选中build.xml,Run As --> External Tools,选中targets这里构上run,ejbjar,后者是打包的deploy目录,而前者是执行Client,但是依赖后者,所以之间选择run就可以了。然后点击run按钮,可以在Console透视图可以看到:
Buildfile: D:\workspace\Ejb3Tutorial\build.xml
prepare:
compile:
ejbjar:
run:
     [java] 1 + 1 = 2
     [java] 1 - 1 = 0
BUILD SUCCESSFUL
Total time: 2 seconds

好了,到这里我们的第一个无状态会话bean就开发完成,别且看到了正确的结果。可以看到EJB3.0消除了home接口,和一些其他的东东,而采用Annotation来设计实现,这样的无侵入架构真的让人对他很有期待,等着看吧。^_^

  • ec9de621-4e75-474a-8fc6-00c181a0113e-thumb.bmp
  • 大小: 111.5 KB
  • e9cfc6b1-8555-44f3-b3ba-e8c7fddbbc5e-thumb.bmp
  • 大小: 48.7 KB

评论
4 楼 kujioon 2007-08-02   引用
10:41:51,140 WARN [JmxKernelAbstraction] jboss.j2ee:jar=calculator.jar,name=CalculatorBean,service=EJB3 is not registered
10:41:51,156 INFO [JmxKernelAbstraction] creating wrapper delegate for: org.jboss.ejb3.stateless.StatelessContainer
10:41:51,171 INFO [JmxKernelAbstraction] installing MBean: jboss.j2ee:jar=calculator.jar,name=CalculatorBean,service=EJB3 with dependencies:
10:41:51,171 INFO [EJBContainer] STARTED EJB: org.ligong.CalculatorBean ejbName: CalculatorBean
10:41:51,218 INFO [EJB3Deployer] Deployed: file:/D:/jboss-4.2.0.GA/server/all/deploy/calculator.jar
3 楼 laobai 2007-07-12   引用
首先谢谢前面两位了,我也遇到了 cachalot的问题,异常和他的相同。另外consle中还有一个WARN:
10:41:51,140 WARN  [JmxKernelAbstraction] jboss.j2ee:jar=calculator.jar,name=CalculatorBean,service= EJB3 is not registered
10:41:51,156 INFO  [JmxKernelAbstraction] creating wrapper delegate for: org.jboss.ejb3.stateless.StatelessContainer
10:41:51,171 INFO  [JmxKernelAbstraction] installing MBean: jboss.j2ee:jar=calculator.jar,name=CalculatorBean,service=EJB3 with dependencies:
10:41:51,171 INFO  [EJBContainer] STARTED EJB: org.ligong.CalculatorBean ejbName: CalculatorBean
10:41:51,218 INFO  [EJB3Deployer] Deployed: file:/D:/jboss-4.2.0.GA/server/all/deploy/calculator.jar
我想可能有些关系吧,猜的而已,
不过我按照 cachalot的方法做了。把jboss aop的类库去掉了,成功运行了,上面的WARN仍然是存在的。
这其中的奥秘令人费解,还请大侠们帮忙!
不甚感激!!!
2 楼 cachalot 2007-06-21   引用
自己解决了,主要是因为我是直接运行的Client.class类,通过已经设置好classpath的范例自带的ant脚本运行就没有问题。
如果直接运行Client.class,需要导入jbossall-client.jar。另外使用JBossIDE新建的EJB3项目,默认的自动导入了jboss aop的类库,不知道为什么,有它在就会抛出上面说的异常,我把它从构建路径中除去后就可以正常运行了。很奇怪啊范例ant脚本中的classpath不是也有包含jboss aop的jar吗,为什么这个脚本就可以?恳请哪位大牛人知道的帮忙解释一下,感激不尽。
还有local接口不能运行的问题,是我概念不清,因为客户端没有运行在ejb容器里,所以只能调用remote接口,我写了个servlet放在jboss服务器上,就能成功调用local接口了
1 楼 cachalot 2007-06-19   引用
感谢lsy的指点,不过我在运行时,抛出了异常:
Java代码
  1. Exception in thread "main" java.lang.reflect.UndeclaredThrowableException  
  2.     at $Proxy0.add(Unknown Source)  
  3.     at org.jboss.tutorial.stateless.client.Client.main(Client.java:34)  
  4. Caused by: java.lang.Exception: Can not make remoting client invocation due to not being connected to server.  
  5.     at org.jboss.remoting.Client.invoke(Client.java:1555)  
  6.     at org.jboss.remoting.Client.invoke(Client.java:530)  
  7.     at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:41)  
  8.     at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88)  
  9.     at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:46)  
  10.     at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88)  
  11.     at org.jboss.aspects.security.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:40)  
  12.     at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88)  
  13.     at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:72)  
  14.     at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88)  
  15.     at org.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:103)  
  16.     ... 2 more  
Exception in thread "main" java.lang.reflect.UndeclaredThrowableExceptionat $Proxy0.add(Unknown Source)at org.jboss.tutorial.stateless.client.Client.main(Client.java:34)Caused by: java.lang.Exception: Can not make remoting client invocation due to not being connected to server.at org.jboss.remoting.Client.invoke(Client.java:1555)at org.jboss.remoting.Client.invoke(Client.java:530)at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:41)at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88)at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:46)at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88)at org.jboss.aspects.security.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:40)at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88)at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:72)at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88)at org.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:103)... 2 more

Client中改成
Java代码
  1. Calculator calculator = (Calculator) ctx.lookup("CalculatorBean/local");  
Calculator calculator = (Calculator) ctx.lookup("CalculatorBean/local");

后,抛出异常:
Java代码
  1. Exception in thread "main" javax.ejb.EJBException: Invalid invocation of local interface (null container)  
  2.     at org.jboss.ejb3.stateless.StatelessLocalProxy.invoke(StatelessLocalProxy.java:77)  
  3.     at $Proxy0.add(Unknown Source)  
  4.     at org.jboss.tutorial.stateless.client.Client.main(Client.java:33)  
Exception in thread "main" javax.ejb.EJBException: Invalid invocation of local interface (null container)at org.jboss.ejb3.stateless.StatelessLocalProxy.invoke(StatelessLocalProxy.java:77)at $Proxy0.add(Unknown Source)at org.jboss.tutorial.stateless.client.Client.main(Client.java:33)

我是初学EJB,在网上搜了一下还是没找到答案,请问为什么会抛出异常?应该怎样更正?

转载于:https://www.cnblogs.com/guoxu/articles/1783373.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值