再请教一个简单问题[赶紧过来抢分] 用lookup();EJB的分布式只要你用一句简单的LOOUP就可以搞定了。lookup()里面要不要跟IP地址我就忘了,可以去查一下,反正用它没错了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有楼上说的那么简单吗???你最好还是找本ejb的书看看。 jboss做容器的是这样的java.util.Hashtable JNDIParm = new java.util.Hashtable(); JNDIParm.put(Context.PROVIDER_URL, "210.30.67.44:1099");//210.30.67.44是我的ip,jboss的jndi服务端口是1099,服务器不同这个连接串也不同 JNDIParm.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); Context context = new InitialContext(JNDIParm); Object ref = context.lookup("jndiname") ejbnameHome home = (FibonacciHome)PortableRemoteObject.narrow(ref,ejbnameHome.class); 我提两点:1、两个ejb程序不在同一个jvm中运行,他们之间要进行通讯,必须有协议,比如:iiop、rmi、或者其他??1楼说的用lookup();那么它到哪里去lookup()????我知道在j2ee sdk1.3环境下不通jvm间程序互相通讯大致如下(同楼上的在jboss下):try{ Properties h = new Properties(); h.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.cosnaming.CNCtxFactory"); h.put(javax.naming.Context.PROVIDER_URL,"iiop://192.168.168.25:1050"); //iiop://XXX.XXX.XXX.XXX就是你的jndi服务器 InitialContext initContext = new InitialContext(h); QueueConnectionFactory factory = (QueueConnectionFactory)initContext.lookup("factoryName"); Queue queue = (Queue)initContext.lookup("queueName"); initContext.close();}catch(Excepiton _e){ _e.printStackTrace();}但是,在提供iiop命名服务的机器上,它的命名服务怎么配置??有没有权限、授权等??它能接受那些访问者??好像我在两台机器上试了n次,都失败了。2、java的安全控制十分严格,假如两台机器间已经可以访问,有些商业方法针对不同来访者,他们是怎么处理的?? 给你一个现成的例子拿去参考着写吧:try { java.util.Properties h = new java.util.Properties(); h.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,"jrun.naming.JRunContextFactory"); h.put(javax.naming.Context.PROVIDER_URL, "218.97.169.55:2908"); javax.naming.InitialContext ctx = new javax.naming.InitialContext(h); Object o = ctx.lookup("Simple"); ...... } catch (Exception e) { System.out.println(e.toString()); } 注意两点就行了:1,需要把你请求的远程EJB的包设置到你所在机器的环境变量里面。2,“jrun.naming.JRunContextFactory”根据你请求的J2EE服务器不同而不同;"218.97.169.55:2908“是你请求的J2EE服务器的IP地址和命名空间端口号。配置好这两点后,其他的你什么都不用管了,就象使用本机器EJB那样LOOKUP()就行了。 但是,我按照 tianboguang说的做,出现下面错误;javax.naming.NameNotFoundException. Root exception is org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0 at org.omg.CosNaming.NamingContextPackage.NotFoundHelper.read(NotFoundHelper.java:72) at org.omg.CosNaming._NamingContextExtStub.resolve(_NamingContextExtStub.java:406) at com.sun.jndi.cosnaming.CNCtx.callResolve(CNCtx.java:440) at com.sun.jndi.cosnaming.CNCtx.lookup(CNCtx.java:492) at com.sun.jndi.cosnaming.CNCtx.lookup(CNCtx.java:470) at javax.naming.InitialContext.lookup(InitialContext.java:347) at mylib.test.jms.QSender.send(QSender.java:42) at mylib.test.jms.QSender.main(QSender.java:24)代码如下: //查询JNDI Properties h = new Properties(); h.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.cosnaming.CNCtxFactory"); h.put(javax.naming.Context.PROVIDER_URL,"iiop://192.168.168.25:1050"); InitialContext initContext = new InitialContext(h); System.out.println("-------------"); QueueConnectionFactory factory = (QueueConnectionFactory)initContext.lookup(factoryName); System.out.println("........................."); Queue queue = (Queue)initContext.lookup(queueName); System.out.println(factory + "..." +queue); initContext.close(); //创建jms QueueConnection connection = factory.createQueueConnection(); QueueSession session = connection.createQueueSession(false,Session.AUTO_ACKNOWLEDGE); QueueSender sender = session.createSender(queue); 把那个IIOP去掉呀,RMI-IIOP是用来做非JAVA客户端的通信的(以前解决这个是用CORBA)。再检查一下了,按上面做是肯定没错的。如果你还有什么要权限密码等安全限制的话,就写在那个Properties里就可以了。EJB的分布式处理是非常简单的,它的设计就是为了让你能把精力从这些服务端底层编程中解放出来,让你能专心于业务逻辑的实现。 还有,你不是在JBOSS下吗,怎么不用“org.jnp.interfaces.NamingContextFactory”;而用“com.sun.jndi.cosnaming.CNCtxFactory” 不是的,我在sun自带的 j2ee sdk1.3环境下做的,好像去掉了iiop就不行了,j2ee sdk1.3在1050端口开取了iiop服务我的错误我找到了,是没找到该命名,现在该过来了,谢谢你的帮助,分,加上! 天涯论坛接口 struts2问题..请高手指教.. json用于html页面分页出现错误 ejb怎样连接数据库 一个说简单也简单,说难也难的题目,大虾帮帮忙忙呀~~! hibernate的复合主键映射 Jboss上传图片的问题 请问学习JDO从哪里开始呢 关于通过JDBC连接JAVA与ORACLE的问题 需要学AWT、Swing、图形编程吗?!----如果是做servlet、ejb或j2ee方面 hashmap的问题 请教高手!多谢啦!
你最好还是找本ejb的书看看。
java.util.Hashtable JNDIParm = new java.util.Hashtable();
JNDIParm.put(Context.PROVIDER_URL, "210.30.67.44:1099");
//210.30.67.44是我的ip,jboss的jndi服务端口是1099,服务器不同这个连接串也不同
JNDIParm.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
Context context = new InitialContext(JNDIParm);
Object ref = context.lookup("jndiname")
ejbnameHome home = (FibonacciHome)PortableRemoteObject.narrow(ref,ejbnameHome.class);
1、两个ejb程序不在同一个jvm中运行,他们之间要进行通讯,必须有协议,比如:iiop、rmi、或者其他??
1楼说的用lookup();那么它到哪里去lookup()????
我知道在j2ee sdk1.3环境下不通jvm间程序互相通讯大致如下(同楼上的在jboss下):try{
Properties h = new Properties();
h.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.cosnaming.CNCtxFactory");
h.put(javax.naming.Context.PROVIDER_URL,"iiop://192.168.168.25:1050");
//iiop://XXX.XXX.XXX.XXX就是你的jndi服务器
InitialContext initContext = new InitialContext(h);
QueueConnectionFactory factory = (QueueConnectionFactory)initContext.lookup("factoryName");
Queue queue = (Queue)initContext.lookup("queueName");
initContext.close();
}catch(Excepiton _e){
_e.printStackTrace();
}但是,在提供iiop命名服务的机器上,它的命名服务怎么配置??有没有权限、授权等??它能接受那些访问者??好像我在两台机器上试了n次,都失败了。2、java的安全控制十分严格,假如两台机器间已经可以访问,有些商业方法针对不同来访者,他们是怎么处理的??
try
{
java.util.Properties h = new java.util.Properties();
h.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,"jrun.naming.JRunContextFactory");
h.put(javax.naming.Context.PROVIDER_URL, "218.97.169.55:2908");
javax.naming.InitialContext ctx = new javax.naming.InitialContext(h);
Object o = ctx.lookup("Simple");
......
} catch (Exception e) {
System.out.println(e.toString());
} 注意两点就行了:
1,需要把你请求的远程EJB的包设置到你所在机器的环境变量里面。
2,“jrun.naming.JRunContextFactory”根据你请求的J2EE服务器不同而不同;"218.97.169.55:2908“是你请求的J2EE服务器的IP地址和命名空间端口号。
配置好这两点后,其他的你什么都不用管了,就象使用本机器EJB那样LOOKUP()就行了。
ontextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0
at org.omg.CosNaming.NamingContextPackage.NotFoundHelper.read(NotFoundHe
lper.java:72)
at org.omg.CosNaming._NamingContextExtStub.resolve(_NamingContextExtStub
.java:406)
at com.sun.jndi.cosnaming.CNCtx.callResolve(CNCtx.java:440)
at com.sun.jndi.cosnaming.CNCtx.lookup(CNCtx.java:492)
at com.sun.jndi.cosnaming.CNCtx.lookup(CNCtx.java:470)
at javax.naming.InitialContext.lookup(InitialContext.java:347)
at mylib.test.jms.QSender.send(QSender.java:42)
at mylib.test.jms.QSender.main(QSender.java:24)
代码如下:
//查询JNDI
Properties h = new Properties();
h.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.cosnaming.CNCtxFactory");
h.put(javax.naming.Context.PROVIDER_URL,"iiop://192.168.168.25:1050");
InitialContext initContext = new InitialContext(h);
System.out.println("-------------");
QueueConnectionFactory factory = (QueueConnectionFactory)initContext.lookup(factoryName);
System.out.println(".........................");
Queue queue = (Queue)initContext.lookup(queueName);
System.out.println(factory + "..." +queue);
initContext.close(); //创建jms
QueueConnection connection = factory.createQueueConnection();
QueueSession session = connection.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
QueueSender sender = session.createSender(queue);
再检查一下了,按上面做是肯定没错的。
如果你还有什么要权限密码等安全限制的话,就写在那个Properties里就可以了。EJB的分布式处理是非常简单的,它的设计就是为了让你能把精力从这些服务端底层编程中解放出来,让你能专心于业务逻辑的实现。
好像去掉了iiop就不行了,j2ee sdk1.3在1050端口开取了iiop服务我的错误我找到了,是没找到该命名,现在该过来了,谢谢你的帮助,分,加上!