go4it

EJB--SEAM

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  11 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

2008年12月9日 #

1.默认EJB BEAN的名称为JNDI的名称,除非用注解指定。

2.@Remote/@Local可以定义在接口,也可以在实现类定义。

3.如果一个EJB实现了多个接口,必须指定那些接口是remote,哪些是local。

4.另一种定义

@Remote(value={EjbInterface01.class,EjbInterface02.class})
@Local(value={EjbInterface03.class,EjbInterface04.class})

当属性为value而且只定义一个属性时,value可以省略只写值。

5.直接在接口里面定义,那么实现类就不用再定义了。

posted @ 2008-12-09 12:53 go4it 阅读(124) | 评论 (0)编辑 收藏

1.不需要jndi配置,直接new InitialContext()即可,因为本地访问服务器已经有相关配置了。

2.本地客户端也不需要依赖包(相关接口和类定义;client包)。就是web应用在运行时自然处在服务器里面,那些依赖包都有了。

  如果把Jbossall-client.jar也拷到本地客户端来,则会出错。因为在部署web项目时,myeclipse会将jar包部署到web项目下Web-root\web-inf\lib文件夹下。

引起重复出现错误。

posted @ 2008-12-09 12:52 go4it 阅读(115) | 评论 (0)编辑 收藏

1.远程客户端:传值,对象必须序列化,服务器对对象的修改不会在客户端体现。

2.本地客户端:

 (1)创建一个web项目,与jboss部署在同一个JVM当中。

 (2)添加服务器端项目的依赖或手动添加接口的jar包

 (3)在index.jsp改编码。

    本地客户端也可以使用远程调用方式:

<% 
    
		  Hashtable env=new Hashtable();   
		  env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");   
		  env.put(Context.PROVIDER_URL,"localhost:1099");   
		  env.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");   
		  InitialContext cxt=new InitialContext(env);
		  UserManager us=(UserManager)cxt.lookup("UserManagerBean/remote");
		  User u=new User();
		  u.setUsername("persia");
		  u.setPassword("p");
		  
          us.addUser(u);
          
          out.println("user--perisa已经创建。"+u.getId());
   %>

本地客户端的本地调用方式没成功:

00:18:28,661 ERROR [[jsp]] Servlet.service() for servlet jsp threw exception
java.lang.IllegalArgumentException: Wrong target. class com.persia.ejb.UserManagerBean for public void com.persia.ejb.UserManagerBean.addUser(com.persia.ejb.User)
	at org.jboss.aop.joinpoint.MethodInvocation.handleErrors(MethodInvocation.java:141)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:116)
	at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166)
	at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79)
	at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:95)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
	at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:110)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:240)
	at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:210)
	at org.jboss.ejb3.stateless.StatelessLocalProxy.invoke(StatelessLocalProxy.java:84)
	at $Proxy94.addUser(Unknown Source)
	at org.apache.jsp.index_jsp._jspService(index_jsp.java:97)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
	at java.lang.Thread.run(Thread.java:619)

 <% 
    
		  Hashtable env=new Hashtable();   
		  env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");   
		  env.put(Context.PROVIDER_URL,"localhost:1099");   
		  env.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");   
		  InitialContext cxt=new InitialContext(env);
		  UserManager us=(UserManager)cxt.lookup("UserManagerBean/local");
		  
		  User u=new User();
		  u.setUsername("persia");
		  u.setPassword("p");
		  
         us.addUser(u);
          
          out.println("user--perisa已经创建。"+u.getId());
   %>

有待以后多些见识解决或偶遇高人指点。

不大清楚,本地调用还需要JNDI吗?

posted @ 2008-12-09 12:51 go4it 阅读(165) | 评论 (0)编辑 收藏

解决:http://www.blogjava.net/Bobbyliao/archive/2008/10/01/232018.html

  后来发现,原来是UserManagerBean中的@Local,@Remote必须明确写上接口的类型,才可以。修改代码如下:

package cn.study.ejb;

import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;

@Stateless
@Remote(UserManager.class)
@Local(UserManager.class)
public class UserManagerBean implements UserManager {

public void addUser(User user) {
        System.out.println(user.getUsername() + "已经被成功保存!");
        user.setId(13);
    }

}

posted @ 2008-12-09 12:51 go4it 阅读(344) | 评论 (0)编辑 收藏

image

有状态和无状态的会话bean都在客户端产生不同的代理实例

image

不同的是在服务器端,有状态的每次lookup都是新的独立的bean,而无状态的是单例bean。

public class StatelessEjbClient {

	/**
	 * @param args
	 * @throws NamingException 
	 */
	public static void main(String[] args) throws NamingException {
		  Hashtable env=new Hashtable();   
		  env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");   
		  env.put(Context.PROVIDER_URL,"localhost");   
		  env.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");   
		  InitialContext cxt=new InitialContext(env);

		  //第一次会话
		  StatelessEjb se1=(StatelessEjb)cxt.lookup("StatelessEjbBean/remote");
		  System.out.println("刚开始"+se1.getCount());
		  se1.compute(1);
		  System.out.println(se1.getCount());
		  se1.compute(1);
		  System.out.println(se1.getCount());
		  se1.compute(1);
		 System.out.println(se1.getCount());
		  se1.compute(1);
		  System.out.println(se1.getCount());
		 
		  //第二次会话
		  StatelessEjb se2=(StatelessEjb)cxt.lookup("StatelessEjbBean/remote");
		  System.out.println("刚开始"+se2.getCount());
		  se2.compute(1);
		  System.out.println(se2.getCount());
		  se2.compute(1);
		  System.out.println(se2.getCount());
		  se2.compute(1);
		 System.out.println(se2.getCount());
		  se2.compute(1);
		  System.out.println(se2.getCount());
		  se2.compute(1);
		  System.out.println(se2.getCount());
		  
		  System.out.println("ejb1==ejb2"+(se1==se2));
		 
	}

}

第一次运行结果

刚开始0
1
2
3
4
刚开始4
5
6
7
8
9
ejb1==ejb2false

而第二次却不是递增了:

刚开始9
10
11
12
13
刚开始13
14
14
14
14
14
ejb1==ejb2false

什么问题???
posted @ 2008-12-09 12:50 go4it 阅读(285) | 评论 (0)编辑 收藏

1.配置JBOSS服务器

2.new EJB project创建项目

3.创建EJB—》new interface,然后new class实现类,xxxBean命名。

4.注解配置EJB:xxxBean类型:@stateful或@stateless和@remote或@local

5.部署EJB。查看JBOSS\SERVER\DEFAULT\DEPLOY里面部署的EJB.

6.开发EJB客户端:

  (1)new java project

   (2)通过接口调用,将接口--》导出jar包到客户端目录下(jar包名随便起,然后添加为项目liberies时点add jar。使用该接口时再导入该包)。

   (3)将接口jar包添加到项目的类路径下。将JBOSS\client下的jar包也添加到客户端项目里面。(可以先在myeclipse里定义一个库—>java—>build path—>user libery)。

   (4)new class--》初始化上下文(JNDI里面的initial context)—》context.lookup(“EJB名称/remote”)--》调用方法。

   (5)在客户端配置JNDI,告诉context:EJB在哪里。在类路径下面(src)目录下添加jndi.properties。

 

java.naming.factory.initial = org.jnp.interfaces.NamingContextFactory

java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces

java.naming.provider.url = localhost

 

   (6)运行客户端。

 

我实际运行时用jndi.properties文件不能运行成功,提示Cannot instantiate class: org.jnp.interfaces.NamingContextFactory,网上的解决方法是添加jbossall-client.jar但是我添了没效果。于是换成在java文件里面设置,成功。怀疑是我的jndi.properties文件写法有问题,有待验证。

          Hashtable env=new Hashtable();  
          env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");  
          env.put(Context.PROVIDER_URL,"localhost:1099");  
          env.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");  
          InitialContext cxt=new InitialContext(env);

posted @ 2008-12-09 12:49 go4it 阅读(227) | 评论 (0)编辑 收藏

1.企业bean

   (1)session bean(stateless和stateful session bean)

           会话bean:从客户端获得EJB对象开始,然后调用EJB方法,直到客户端释放EJB对象为止。客户端通过JNDI查找EJB对象。若每次会话查找同一对象时,则返回不同对象。

      对象的状态由它的实例变量的值决定的。

     有状态session bean:可以区分不同的客户端,并保持他们的信息。主要是根据jsessionid来辨认不同的客户端并维护他们的状态。

   stateful session bean 远程调用的时候,客户端得到的是一个客户端代理对象,不同的客户端获得不同的实例(同时分配一个令牌)。通过令牌来区分不同的客户端。每次查找服务器新创建一个给客户端。

   stateless session bean 不对其状态做管理。不管是哪个客户端,得到的对象可能都是同一个实例(单例方式管理)。不能区分是哪个客户端。性能比stateful好。每次查找,服务器都返回同一个实例。

   (2)message driven bean 基于JMS

2.实体bean

  entity bean。EJB2的时候分为BMP(bean管理持久化实体bean---自己管理CRUD操作)和CMP(容器管理持久化实体bean--由容器管理CRUD操作)。

在EJB3中都是CMP。

posted @ 2008-12-09 12:48 go4it 阅读(109) | 评论 (0)编辑 收藏

1.远程客户端:客户端和它调用的EJB对象不在同一个JVM进程当中。

2.本地客户端:客户端和它调用的EJB对象在同一个(JBOSS)JVM进程当中。两个EJB相互调用。

3.webservice客户端

 

同一台机器上一个JVM和JBOSS

运行JBOSS需要一个JVM进程,运行一个java类需要JVM进程。

 

远程访问:传值方式:

image

 

本地访问方式:传地址方式,无需序列化。(类似SSH方式)

image

image

 

webservice只能访问无状态会话bean的接口。

 

远程调用,客户端的bean参数实际上是一个参数值的拷贝,对他修改不会影响到bean。但本地调用来说,对bean的参数是个引用,修改将影响bean。

 

粗粒度的数据访问:

远程调用速度比较慢,尽量减少方法的调用,尽可能在一个方法完成所以数据的传输。

posted @ 2008-12-09 12:47 go4it 阅读(156) | 评论 (0)编辑 收藏

1.企业bean

   (1)session bean(stateless和stateful session bean)

           会话bean:从客户端获得EJB对象开始,然后调用EJB方法,直到客户端释放EJB对象为止。客户端通过JNDI查找EJB对象。若每次会话查找同一对象时,则返回不同对象。

      对象的状态由它的实例变量的值决定的。

     有状态session bean:可以区分不同的客户端,并保持他们的信息。主要是根据jsessionid来辨认不同的客户端并维护他们的状态。

   stateful session bean 远程调用的时候,客户端得到的是一个客户端代理对象,不同的客户端获得不同的实例(同时分配一个令牌)。通过令牌来区分不同的客户端。每次查找服务器新创建一个给客户端。

   stateless session bean 不对其状态做管理。不管是哪个客户端,得到的对象可能都是同一个实例(单例方式管理)。不能区分是哪个客户端。性能比stateful好。每次查找,服务器都返回同一个实例。

   (2)message driven bean 基于JMS

2.实体bean

  entity bean。EJB2的时候分为BMP(bean管理持久化实体bean---自己管理CRUD操作)和CMP(容器管理持久化实体bean--由容器管理CRUD操作)。

在EJB3中都是CMP。

posted @ 2008-12-09 12:46 go4it 阅读(167) | 评论 (0)编辑 收藏

今天终于做了一个ejb实例。

工具:myeclipse6,jboss服务器。

 

image

1.new--(myeclipse-j2EE projects)—EJB Project

2.new—ejb3 session bean

3.配置persistence.xml的持久化单元。

(1)  配置数据源

    拷D:\DevelopTool\jboss-4.2.2.GA\docs\examples\jca里面的mysql-ds.xml到D:\DevelopTool\jboss-4.2.2.GA\server\default\deploy里面,做修改。

(2)拷数据库jar包到D:\DevelopTool\jboss-4.2.2.GA\server\default\lib里面

(3)在项目属性里面添加额外的jar包:数据库驱动和D:\DevelopTool\jboss-4.2.2.GA\client\jbossall-client.jar包

posted @ 2008-12-09 12:46 go4it 阅读(158) | 评论 (0)编辑 收藏

1.安装jboss _ide,将myeclipse中的eclipse里面的links考到jbosside目录里面就可以用myeclise的插件了。

2.安装jboss-ejb3-rc补丁

3.创建ejb3工程,配置jboss服务器。

4.新建ejb3文件夹下的sessionbean,自动构建接口跟bean类。命名规范时接口名后加bean。

5.导出jar包,另存为jboss-server-all-deploy xx.jar

6.调用方法:

   (1)初始化上下文

             Context cx=new Context()

    (2)获得接口的实例(在命名空间里查找)

             可以在jmx-console jboss.j2ee找到xxbean如HelloBean的ejb

              Hello hello=(Hello)cx.lookup(“HelloBean/Remote”);

     (3)调用方法。

               hello.say(“linda”);

7.推荐黎洪明的ejb3实例教程或精通ejb3.0

posted @ 2008-12-09 12:46 go4it 阅读(92) | 评论 (0)编辑 收藏