客户端使用EJB

客户端使用EJB类似.NET中的webservice的调用。

先来大致了解一下EJB:

ejb容器管理的标准基础设施服务表包括:分布式事务、安全、并发、持久性、资源池和缓冲、接口、负载均衡、容错管理。 EJB规范中有四种对象类型:无状态会话、有状态、实体、消息驱动bean。

这里用一个无状态的会话bean做为例子,学习客户端调用服务端EJB的方法。

RMI远程调用的过程机理如下图:


在客户端使用EJB的整个调用过程中,非常有必要学习Home和Remote接口。


home接口:

调用EJB的生命周期、创建、删除查找EJB;部署ejb时,home interface stub绑定在jndi上。



remote接口:

用于调用EJB上的方法。



整个调用过程机理:


通过上面两图得知,home接口和Remote接口使用都是通过rmi远程调用来实现的。
Stub和skeleton是通过rmic由声明远程对象业务方法的接口产生的。
客户端的方法通过stub对象,通过rmi远程调用,服务端的skeleton对象,然后实现了对远程对象的方法的调用。


下面使用具体代码演示整个调用过程:

1、定义远程Remote接口方法:

import javax.ejb.EJBObject;
import java.rmi.RemoteException;

public interface  person extends EJBObject{

	public String sayHelloworld() throws RemoteException;
}

这里的方法只负责具体的业务。

继承EJBObject接口,把需要调用的public方法写在里面(这些方法将在SessionBean中实现),注意要声明throws Java.rmi.RemoteException。


2、定义Home接口方法:

import java.io.Serializable;
import java.rmi.RemoteException;
import javx.ejb.CreateException;
import javax.ejb.EJBHome;

public interface personHome extends EJBHome{

	person create() throws RemoteException,CreateException;
}
这里要引入Serializable,要求是要可序列化的,因为是远程调用。在客户端和服务端传输的是被序列化的数据格式,如果在客户端使用的时候,还需要反序列化。

在home接口中,只负责创建实例。至少生成一个create方法, 注意要声明throws java.rmi.RemoteException和javax.ejb.CreateException。


3、真正ejb方法的实现:

import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javx.ejb.SessionContext;

public class personEJB implements SessionBean{

	public String sayHelloworld(){

		return "Hello World";
	}

	public personEJB(){};
	public void ejbCreate(){};
	public void ejbRemove(){};
	public void ejbActivate(){};
	public void ejbPassivate(){};
	public setSessionContext(SessionContext sc){};
}

不能用implents person的方式直接实现远程接口,此处不用抛出RemoteException。


4、发布配置文件ejb-jar.XML,用jar工具生成jar文件,发布工具生成发布使用的jar文件,把.jar文件发布到EJB Server这些操作省略。


5、客户端调用程序:

import javx.naming.*;
import javx.rmi.*;
import java.util.*;

public class TestClient{

	public static void main(String[] args){

          //这里是通过weblogic的调用的实现,还可以有其他的方式:本地、hashtable的实现等
		try {
			String m_url ="t3://localhost:7001";
			Properties h = new Properties();
			h.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
			h.put(Context.PROVIDER_URL,m_url);
			Context initial = new InitialContext(h);
			Object objref =initial.lookup("person");
			personHome home = (personHome)ProtableRemoteObject.narrow(objref,personHome.class);
			person ms = home.create();
			System.out.println(ms.sayHellworld());
			
			
		}catch(Exceptoin ex){
			System.out.println(ex.getMessage());

		}

	}	
}

客户端调用的时候,使用到了jndi查找远程对象,在上一篇博客中已经有过详述,这里就不再赘述,客户端在调用的时候通过就像使用本地对象一样随意调用远程ejb中的方法。


总结:

服务端ejb中定义的各种方法和接口都是为客户端的调用服务,除了无状态的会话bean还有有状态的会话bean、当然还会引入一系列的事务、安全等等机制,这里的水很深,会在以后的学习中不断深入,这里只对整个调用流程做简单探讨。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Files contained in javax.ejb.jar: META-INF/MANIFEST.MF javax.ejb.AccessLocalException.class javax.ejb.AccessTimeout.class javax.ejb.ActivationConfigProperty.class javax.ejb.AfterBegin.class javax.ejb.AfterCompletion.class javax.ejb.ApplicationException.class javax.ejb.Asynchronous.class javax.ejb.AsyncResult.class javax.ejb.BeforeCompletion.class javax.ejb.ConcurrencyManagement.class javax.ejb.ConcurrencyManagementType.class javax.ejb.ConcurrentAccessException.class javax.ejb.ConcurrentAccessTimeoutException.class javax.ejb.CreateException.class javax.ejb.DependsOn.class javax.ejb.DuplicateKeyException.class javax.ejb.EJB.class javax.ejb.EJBAccessException.class javax.ejb.EJBContext.class javax.ejb.EJBException.class javax.ejb.EJBHome.class javax.ejb.EJBLocalHome.class javax.ejb.EJBLocalObject.class javax.ejb.EJBMetaData.class javax.ejb.EJBObject.class javax.ejb.EJBs.class javax.ejb.EJBTransactionRequiredException.class javax.ejb.EJBTransactionRolledbackException.class javax.ejb.embeddable.EJBContainer.class javax.ejb.EnterpriseBean.class javax.ejb.EntityBean.class javax.ejb.EntityContext.class javax.ejb.FinderException.class javax.ejb.Handle.class javax.ejb.HomeHandle.class javax.ejb.IllegalLoopbackException.class javax.ejb.Init.class javax.ejb.Local.class javax.ejb.LocalBean.class javax.ejb.LocalHome.class javax.ejb.Lock.class javax.ejb.LockType.class javax.ejb.MessageDriven.class javax.ejb.MessageDrivenBean.class javax.ejb.MessageDrivenContext.class javax.ejb.NoMoreTimeoutsException.class javax.ejb.NoSuchEJBException.class javax.ejb.NoSuchEntityException.class javax.ejb.NoSuchObjectLocalException.class javax.ejb.ObjectNotFoundException.class javax.ejb.PostActivate.class javax.ejb.PrePassivate.class javax.ejb.Remote.class javax.ejb.RemoteHome.class javax.ejb.Remove.class javax.ejb.RemoveException.class javax.ejb.Schedule.class javax.ejb.ScheduleExpression.class javax.ejb.Schedules.class javax.ejb.SessionBean.class javax.ejb.SessionContext.class javax.ejb.Session

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值