Embedded EJB3是否能用java代码作为客户端调用?

06-12-14 maqujun
大家好:

在jboss中我们可以在eclipse中直接通过以下代码来调用运行中的EJB3 Service.

Properties props = new Properties();

props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");

props.setProperty("java.naming.provider.url", "localhost:1099");

props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");

InitialContext ctx = new InitialContext(props);

Object obj = ctx.lookup("HelloWorldBean/remote");

但是在Embedded EJB3版本中它的客户端的properties与jboss中的不同变为:

props.put("java.naming.factory.initial", "org.jnp.interfaces.LocalOnlyContextFactory");

props.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");

我在tomcat中运行我的Embedded Ejb3。使用jsp客户端可以调用EJB3。

但是在eclipse中直接以上写入客户代码却throw Exception是否意味着Embedded EJB3只能在服务器能调用?不支持直接的java代码调用?

Thanks for any reply

maxlio
2006-12-18 18:13
没人玩过jboss的Embedded EJB3吗?看出来了,这世界上只有我这么一个倒霉蛋要用这一还不成熟的技术。目前Embedded EJB3的最新版本是alpha9,但是这个最新版本有一个最大的bug就是无法再Tomcat中运行。当然还有其他很多bug,毕竟目前还只是alpha版本。所以我选择的是前一版本alpha8.

Embedded EJB3运用了目前动态AOP的方式。在Tomcat启动时通过web.xml中的设置动态加载Ejb3的Listener。同时还允许通过URL实现动态部署EJB3。就是意味着只要有Embedded Ejb3就可以在任何容器中运行EJB3。

可惜还没有正式版本的诞生,bug很多。期待中...

说正题吧,我已经花了一个礼拜去研究她的java客户端却没有收获。问jboss官网也没人回,但我个人觉得他是不允许的。从客户端的properties中可以看出embed版本去除了url这一项,并且把factory改为了LocalOnlyContextFactory,从这名字上去理解就是只允许本地容器内调用。可我无法确定。

banq
2006-12-19 09:21
我也没你这么新潮,没玩过这个试验。

不过,我认同你的"LocalOnlyContextFactory,从这名字上去理解就是只允许本地容器内调用",因为无论是EJB3/EJB2,从底层都没有脱离JNDI这个基础机制,只有通过JNDI才可以实现分布式计算。

所以,如果想在远程调用调用另外一台机器的组件,必须通过JNDI,而且一定需要一个JNDI服务器。

maxlio
2006-12-19 10:05
谢谢banq的回复,有您这句话我就可以理直气壮对客户说:我们大哥说了,你们的要求是不可能实现的.

banq
2006-12-19 10:41
>我们大哥说了,你们的要求是不可能实现的

别,这和客户要求可能不是一回事,我也没有亲手试验,JBoss4以后bug是很多,当他们开始将JBoss组件切分时,不免丢三拉四,当初设计概念太死了,如果早点意识到组件可彻底分离定制是一个方向,何苦现在呢?

将EJB在Tomcat下运行,实际最后的结果是,将Tomcat武装成了JBoss...如果你的客户是需要将EJB在Tomcat下运行,怎么没有意识到这是兜了一圈又回来了呢?

maxlio
2006-12-19 15:30
客户的要求就是在任何一个已知的J2EE容器中部署EJB3,可目前支持EJB3的容器也就JBOSS和weblogic 9.2 tech preview. 所以我才选择尝试JBOSS的Embedded EJB3。其实我已经在Embedded EJB3上花了一周的时间了。我做过JBOSS上的EJB3,所以我个人的观点是Embedded EJB3不可能实现java client调用。谢谢banq大哥的回帖支持。

bjshasha
2006-12-29 16:50
搭一下顺风车

现在用到的EJB3 Service 的声明部分

@Service(objectName = "xxx:service=EquipMgmt")

@Management(EquipMgmtBeanHome.class)

@Remote(EquipMgmtBeanRemote.class)

@RemoteBinding(jndiBinding ="com.xxx.nms_1_0.server.nmserver.equipmgmt.EquipMgmtBeanRemote")

public class EquipMgmtBean implements EquipMgmtBeanHome, EquipMgmtBeanRemote {

然后在另一个Session bean 中调用

Properties JNDIProperties = new Properties();

try {

//JNDIProperties.load(new FileInputStream("jndi.properties"));

JNDIProperties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");

JNDIProperties.put("java.naming.provider.url", "localhost:1099");

JNDIProperties.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");

InitialContext ctx;

ctx = new InitialContext(JNDIProperties);

EquipMgmtBeanRemote EquipObj = (EquipMgmtBeanRemote) ctx.lookup(EquipMgmtBeanRemote.class.getName());

ret = EquipObj.stopPollingSession(sessionId);

}

这个用法目前是没有问题的

不过现在在考虑把项目放到其他应用服务器里的情况

疑问 Jboss4 的 EJB3 Service 是否是JBoss自己独有的实现方式

如果是JBoss独有的 在其他应用服务器中用啥来替代这个东西

这两天正在看还没最终结果 呼呼

maxlio
2006-12-30 10:36
就我所致目前支持EJB3的就只用两个容器:JBOSS和Weblogic10.

两者的annotation不同,客户端的调用的jndi的property也不同。但区别不大。所以说两者不能直接移植,要稍做改动。

banq
2006-12-30 11:48
目前支持EJB3还有Oracle,它的持久层实现使用的是toplink, JBoss使用的是Hibernate,Weblogic收购JDO实现kodo,使用kodo实现EJB3持久层。

bjshasha
2006-12-31 09:54
对于EJB3 Service模式 是一种通用的模式么

我在Ejb3 的API中没有找到

org.jboss.annotation.ejb.Management;

org.jboss.annotation.ejb.Service;

对应的声明

所以很想知道同样的方式在其他的Server中是否有类似实现

因为涉及到程序的最终结构 所以一直在查

客户端的调用的jndi的property不同 应该很容易解决吧

bjshasha
2007-01-04 09:22

查了一下JBOSS的资料

我上述的说法有问题

Jboss 的Mbean服务分为两类

一 是不依赖于Jboss服务的

二 依赖Jboss反映委员的

第一类的Mbean 就是针对每个JMX规范编写的Mbean JMX规范没有定义任何类型的Mbean 生命周期或者依赖管理

第二类的Mbean 是创建一个依赖于Jboss服务的Mbean 需要遵循Jboss服务的模式Jboss Mbean 服务模式由一系列生命周期操作函数组成的,这些函数在Mbean状态改变时能够发出消息通知。消息通知可以在Mbean创建、停止、销毁时通知Mbean 服务。

所以我所要找的应该是一种能够实现类似“Jboss Mbean服务”的通用的实现方式(没办法客户希望能够跨应用服务器)

大家有什么好的建议

[该贴被bjshasha于2007-01-04 09:23:34修改过]

banq
2007-01-04 18:13
>客户希望能够跨应用服务器

那就是POJO了,JMX的Mbean不能严格算是POJO,因为要依赖JMX,所以应用服务器必须是JMX,MBean才能跨服务器。

使用POJO就必须配合框架,如Spring /JBoss Seam 或JdonFramework,JBoss Seam可以和JBoss Embeddable EJB3一起在tomcat下运行,下面参考:

http://www.michaelyuan.com/blog/2006/11/14/seam-without-ejb3/

YRHYRH
2007-04-28 23:43
可目前支持EJB3的容器也就JBOSS和weblogic 9.2 tech preview.???????

这样的话SUN搞Glassfish来干嘛??看来是我于世隔绝了。。。

无语。。。。

猜你喜欢