前几天看完黎活明老师写的EJB3入门经典,今天对照课本上的例子,自己实现了一下,其中遇到几个问题,不过最后还是解决了,这里跟大家分享一下,也希望大家能够共同探讨这方面的知识。
环境:JDK5.0+JBOSS4.2.2GA+ECLIPSE3.2
如何在JBOSS中部署EJB,这里就不写了。不过,对于JBOSS相关配置,这里还是带一下:
JBOSS默认的端口是8080,并且JBOSS4.2.2GA默认只能通过http://localhost:8080/或者http://127.0.0.1:8080/来访问,需要修改配置文件JBOSS_HOME的\server\default\deploy\jboss-web.deployer\server.xml 中的如下配置:
[quote]
<Connector port="8080" address="0.0.0.0"
maxThreads="250" maxHttpHeaderSize="8192"
emptySessionPath="true" protocol="HTTP/1.1"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />[/quote]
将其中的${jboss.bind.address}改为0.0.0.0 ,才能用http://ip:port的方式访问,
端口一样的改,其中遇到一个很奇怪的问题,我改完之后,加了一条注释,结果重启JOBSS,死活都不行,异常一大堆,最后把注释去掉,就好了,这个不知道是什么原因,server.xml中本身就有很多注释,再加我一条,就不行了?
还有我们在写客户端的时候有这样一句
如果客户端和服务端不在同JVM下,你通过修改上面的配置,再把localhost改为服务器IP是无效的,至少我试验的结果是这样,需要启动的时候加上这个:
[color=red][quote]run -b 0.0.0.0[/quote][/color]
客户端才能连上服务器。
1、服务端代码如下:
另外一个无状态会话BEAN
这个BEAN需要引入javaee.jar,JBOSS中没有,所以需要另外下载
2、客户端,我新建了一个普通工程EJBTest
客户端需要引入包jbossall-client.jar,这个包在jboss-4.2.2.GA\client目录下有。并且服务端的HelloWorld接口拷贝到这个包下,执行,报异常:
[code="java"]javax.naming.CommunicationException
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:786)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627)
at javax.naming.InitialContext.lookup(InitialContext.java:351)
at com.foshanshop.ejb3.aa.HelloWorldTest.main(HelloWorldTest.java:25)[/code]
刚开始以为是缺少包,后来又引入几个相关的包,一样报错,异常上说找不到com.foshanshop.ejb3.HelloWorld 这个类,前面包名是服务端的包名,我在客户端的包名是com.foshanshop.ejb3.aa,这里有点想不明白,唯一可以解释的是EJB在发布的时候,接口是带包名一起发布的, 如果真是这样,有点不合情理,希望在以后的学习中能够解决这个疑惑吧,我把客户端包名改成与服务端一致,执行,一切正常,第一个EJB完成。
环境:JDK5.0+JBOSS4.2.2GA+ECLIPSE3.2
如何在JBOSS中部署EJB,这里就不写了。不过,对于JBOSS相关配置,这里还是带一下:
JBOSS默认的端口是8080,并且JBOSS4.2.2GA默认只能通过http://localhost:8080/或者http://127.0.0.1:8080/来访问,需要修改配置文件JBOSS_HOME的\server\default\deploy\jboss-web.deployer\server.xml 中的如下配置:
[quote]
<Connector port="8080" address="0.0.0.0"
maxThreads="250" maxHttpHeaderSize="8192"
emptySessionPath="true" protocol="HTTP/1.1"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />[/quote]
将其中的${jboss.bind.address}改为0.0.0.0 ,才能用http://ip:port的方式访问,
端口一样的改,其中遇到一个很奇怪的问题,我改完之后,加了一条注释,结果重启JOBSS,死活都不行,异常一大堆,最后把注释去掉,就好了,这个不知道是什么原因,server.xml中本身就有很多注释,再加我一条,就不行了?
还有我们在写客户端的时候有这样一句
pro.setProperty(Context.PROVIDER_URL, "localhost:1099");
如果客户端和服务端不在同JVM下,你通过修改上面的配置,再把localhost改为服务器IP是无效的,至少我试验的结果是这样,需要启动的时候加上这个:
[color=red][quote]run -b 0.0.0.0[/quote][/color]
客户端才能连上服务器。
1、服务端代码如下:
package com.foshanshop.ejb3;
public interface HelloWorld {
public String SayHello(String name);
}
另外一个无状态会话BEAN
package com.foshanshop.ejb3.impl;
import com.foshanshop.ejb3.HelloWorld;
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Stateless
@Remote ({HelloWorld.class})
public class HelloWorldBean implements HelloWorld {
public String SayHello(String name) {
return name +"说:你好!世界,这是我的第一个EJB3哦.";
}
}
这个BEAN需要引入javaee.jar,JBOSS中没有,所以需要另外下载
2、客户端,我新建了一个普通工程EJBTest
package com.foshanshop.ejb3.aa;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class HelloWorldTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Properties pro = new Properties();
pro.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
pro.setProperty(Context.PROVIDER_URL, "localhost:1099");
pro.setProperty(Context.URL_PKG_PREFIXES,"org.jboss.naming:org.jnp.interfaces");
InitialContext ctx;
try {
ctx = new InitialContext(pro);
System.out.println(ctx);
// HelloWorld helloworld = (HelloWorld) javax.rmi.PortableRemoteObject.narrow(objRef, HelloWorld.class);
HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote");
String result = helloworld.SayHello("佛山人");
System.out.println(result);
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端需要引入包jbossall-client.jar,这个包在jboss-4.2.2.GA\client目录下有。并且服务端的HelloWorld接口拷贝到这个包下,执行,报异常:
[code="java"]javax.naming.CommunicationException
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:786)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627)
at javax.naming.InitialContext.lookup(InitialContext.java:351)
at com.foshanshop.ejb3.aa.HelloWorldTest.main(HelloWorldTest.java:25)[/code]
刚开始以为是缺少包,后来又引入几个相关的包,一样报错,异常上说找不到com.foshanshop.ejb3.HelloWorld 这个类,前面包名是服务端的包名,我在客户端的包名是com.foshanshop.ejb3.aa,这里有点想不明白,唯一可以解释的是EJB在发布的时候,接口是带包名一起发布的, 如果真是这样,有点不合情理,希望在以后的学习中能够解决这个疑惑吧,我把客户端包名改成与服务端一致,执行,一切正常,第一个EJB完成。