- 1、EJB是为了构建企业级的、分层的、分布式的应用标准,降低开发的复杂性。(包含以下一些问题)
- Remote Method Invocations(远程方法调用)
- Load Balancing(负载平衡)
- Transparent Fail-over(错误感知、容错性,将一台有问题主机的服务或用户会话状态迁移到另一台)
- Back-end Integration(后端系统集成,如数据库)
- Transactions(事务)
- Clustering(集群)
- Dynamic Redeployment(动态部署)
- Clean Shutdown(平稳关机,在最后一个用户退出后关机,保持当前用户用完退出,新用户不再进入)
- Logging and Auditing
- Systems Management
- Threading
- Message-oriented and Middleware
- Component Life Cycle
- Resource pooling
- Security
- Caching
- ...
2、远程方法调用实现方式
- 定义公共接口
- 本地方法从命名服务器中获得存根对象(命名服务器初始化时需要:a、命名服务器的驱动. b、网络信息)
- 存根对象调用方法,远程拦截器通过代理在方法前后插入中间件服务(事务安全等),再调用远程方法。(拦截器也实现了接口)
- 在同一个JVM中的调用为本地调用,在不同JVM中的未远程调用(用物理主机是否分隔无关)。
3、中间件服务分显示和隐式两中
- 显示的,比如自己声明事务边界,自己open,commit。
- 隐式的,同步部署描述符或标注,定制服务。
4、SOA与EJB
- SOA抽象服务,功能的对外接口,一些列组件提供,抽象为数据交互,做到一般适用化。
- SOA不关心是用什么语言实现,不关心用了多少组件,适用公共接口和互操作协议,达到异构平台的互操作。
- EJB通过Web service来实现SOA。(corba也是一种SOA实现,但比较复杂)
5、Web Service的主要技术
- SOAP:Simple Object Access Protocol.互操作协议。(必须)
- WSDL:Web Service Description Language.类似于适用说明。(非必须)
- 都是通过XML文件来描述
6、常用Java EE技术列表
- Enterprise JavaBeans(EJB)
- Java API for Web Services(JAX-WS)提供Web服务的简单支持
- The Web Services Metadata for the Java Platform
- Java Remote Method Invocation(RMI) (远程方法调用)and RMI-IIOP(远程方法调用的互操作协议,EJB用这个,WebService用SOAP)
- Java Naming and Directory Interface(JNDI)(适用命名协议的统一API)
- Java Database Connectivity(JDBC)
- Java Transaction API(JTA) and Java Transaction Service(JTS)(事务支持的服务)
- Java Messaging Service(JMS)(异步应用,参考手机短信,由消息服务器提供,用户通过统一API调用)
- Java Servlets
- Java Server Pages(JSP)
- Java Server Faces(JSF)
- Java EE Connector Architecture(JCA)(与后端系统集成,规定后端系统需要实现的接口)
- Java API for XML Parsing(JAXP)
- Java Architecture for XML Binding(JAXB)
- Java Authentication and Authorization(JAAS)(Java认证和授权服务)
7、开发EJB的环境
- Java SE (basic libraries)
- Java EE (Add-on libraries to support JSP/Servlets and EJB, Deploy tool ,Java EE serever)
8、列子
9、查看Jboss上的EJB服务
- http://localhost:8080/ -> JMS Console -> jboss-service=JNDIView -> java.lang.String list() - invoke -> 查找全局JNDI名字(Global JNDI Namespace)
- 一些JNDI是本地的,只供JBOSS内部访问
10、EJB的类型
1)、Session bean : model business process,
- Stateful Session Bean
Maintains state whici is encapsulated within the bean instance
Across multiple client requests
- Stateless Session Bean
2)、Message-driven bean :similar to session bean, asynchronoous programming model.
3)、Entity bean: model business data.(已经用JPA代替)
- Has not been enhanced in EJB3.0
- Will not be included in course
- Uses Entity API instead
11、Session Bean Subtypes
Stateless Session Beans
- Represent single request conversation
- Need not to keep states across method invocations
- Can be shared by multiple clients
- 单线程,共享的,容器会维护一个bean池。
Stateful Session Beans
- Represent business process drawn-out conversations over several request
- Designated to service business processes that span multip method request or transactions
- Retain state on behalf of an individual client
12、Stateless Session Bean声明周期
创建:
- newInstance()
- dependency injection 依赖注入
- 调用@PostConstruct,类似初始化方法
销毁
- @PreDestroy 销毁前的回调方法
13、Stateful Session Bean 交换策略和生命周期
交换策略:当心的请求来临,当前stateful session bean已达到服务器的最大限制,就将不活动的bean钝化,序列化到磁盘上。
当刚才不活动的用户活动时,再从容器中将刚才钝化的信息拿回来重新去找个不活动的bean相应请求。
(就是拆东墙补西墙)。
@PerPassivate:钝化前的回调方法。
@PostActivate: 反钝化后的回调方法。
钝化时序列化对象:(以下对象容器维护)
- 非transient的原始类型
- 非transient的java对象
- 对其他bean的引用
- SessionContext(EJB上下文),The UserTransaction(事务),EntityManager or EntityManagerFactory,or a Timer object(容器维护)
- JNDI naming contexts
不被序列化的对象:比如JDBC的连接connector等等,需要自己处理。
生命周期:
创建:
- newInstanse()
- Dependency injection
- @PostConstruct
钝化和反钝化
-
@PrePassivate
-
@PostActivate
销毁
-
@PreDestroy
14、使用@Interceptors({xxx.class}) 定义生命周期回调的监听器
- 定义4个回调方法
- 执行顺序:从外到内(优先实现类本身的),从左到右(定义的监听器)
15、使用部署描述符 XML
部署描述符 可以覆盖 标注。(便于修改,而不用重新编译源代码)
16、 @Remove标注
标注业务方法,客户自己调用,告诉容器,已经完成调用,可以移除此bean,而不是等会话超时。
17、通过System.setProterty()设置系统环境变量, 可以完成进程间通讯
或也可以再JVM启动时使用 -D设置环境变量。
18、编写Web Service 的两种方式
- 先写java类,用容器生成wsdl
- 写wsdl,通过工具生成java类
例子:
- 编写一个java类,使用@WebService标注类
- 在web.xml中作为servlet 标注映射关系, 部署在容器中(如jboss)
- 使用工具生成JAVA类。在JBOSS中http://localhost:8080/jbossws/ -> View a list of deployed services -> 找到服务端点地址(http://tarena-teacher:8080/sd10702-web/Converter?wsdl)
jboss/bin/wsconsume.bat http://tarena-teacher:8080/sd10702-web/Converter?wsdl -o F:/
-o : 指明生成文件存放位置
-k : 同时保存JAVA文件
- 编写客户类,运行时需要包含Jboss相关jar包.
19、EJB2.1之后 Stateless Session Bean也能发布为webService
扩展了用户接口:这样用户可以通过RMII-IIOP类型的客户端,也可以用webService的类型访问。
20、以上调用WebService都是静态的方式,就是指服务端都是固定的,如果服务端的IP变更之类,就会调用失败。
可以通过查看源码,找到对应的URL和server定位变量,通过参数的形式输入URL等信息,来显示得定义服务地址,完成动态调用。