JCA1.5学习笔记
张小根
1、 范围:
JCA1.0定义了在应用服务器和EIS(企业信息系统)之间系统级的一个标准的协议集合,这些协议集中于集成的系统级的重要方面:连接管理(connection management),事务管理(transaction management),安全管理(security management)。并且定义了客户端与多个企业信息系统交互的CCI(Common Client Interface)通用客户端接口,以及针对资源适配器的一个标准的配置发布及打包协议。
JCA1.5定义了以下协议:
² 生命周期管理协议(Lifecycle management contract):这是应用服务器和资源适配器之间的一个协议,允许应用服务器来管理资源适配器的生命周期。这个协议为应用服务器在资源适配器在配置发布或应用服务器启动的时候提供一种启动资源适配器实例的机制,并且在资源适配器卸载或应用服务器关闭的时候通知资源适配器实例关闭。
² 工作管理协议(Work managerment contract):这是应用服务器和资源适配器之间的一个协议,该协议允许资源适配器通过提交工作实例给应用服务器来做一些工作(象监视网络端口,调用应用程序组件等)。然后应用服务器通过分配线程来执行提交的工作实例,这就避免了资源适配器为了执行一些任务来直接创建或者管理线程,并且可以使得应用服务器在运行时环境对线程池来实施更多更有效的控制管理。并且资源适配器能控制被执行的工作实例的安全上下文环境和事务上下文环境。
² 事务流入协议(Transaction inflow contract):该协议是应用服务器和资源适配器之间的一个协议,它允许资源适配器来传递一个输入事务到应用服务器。这个协议也允许资源适配器来传递由企业信息系统初始化的事务完成和故障恢复调用,并且能确保被输入的事务的ACID(Atomicity原子性,Consistency一致性,Isolation隔离性 and Durability持久性)属性被保留。
² 消息流入协议(Message inflow contract):这是应用服务器和资源适配器之间一个标准的、通用的协议,它允许资源适配器以独立于发送消息所使用的具体消息格式、消息语义、消息结构的方式异步的发送消息到位于应用服务器中的消息端口。这个协议也允许更广泛消息提供者(象Java Message Service,Java API for XML Messaging等)通过资源适配器以插件的方式插入到J2EE兼容的应用服务器中。
² 针对不通类型(outbound only输出,inbound only输入,or both输入输出)的资源适配器描述对应的打包模式。
2、 生命周期管理
² 应用服务器实现javax.resource.spi.BootstrapContext和javax.resource.spi.WorkManager接口。资源适配器实现javax.resource.spi.ResourceAdapter接口。实现ResourceAdapter接口的类是在资源适配器的配置描述文件中指定的,并且这个实现类必须是一个JavaBean。
当一个资源适配器被配置发布或者应用服务器启动的时候,应用服务器在它自己的地址空间启动一个资源适配器的实例。为了启动一个资源适配器实例,应用服务器必须使用配置了的ResourceAdapter接口的实现类,并且调用它的start方法,这个start方法调用是来自应用服务器的启动通知,并且这个start方法是被应用服务器的线程调用的。
一个应用服务器允许在同一个JVM中同时存在多个资源适配器实例,但这些实例不一定相等,判断这些实例是否相等,可以通过实例的equals方法,因此ResourceAdapter接口的实现类需要实现equals方法。
在start方法调用中,资源适配器实例初始化自己,并且可能使用WorkManager来提交Work实例来执行。这个start方法调用应该及时返回,应该避免阻塞调用,如调用WorkManager实例的doWork方法就是阻塞调用。如果在start方法中调用了WorkManager实例的doWork方法或者任何阻塞的方法,应用服务器都可能抛出一个WorkRejectedException异常,为了强制start方法不被阻塞,强烈建议资源适配器实现使用WorkManager的startWork和scheduleWork方法来代替doWork方法。
在调用start方法时抛出任何异常将导致应用服务器创建资源适配器实例失败,在JCA将来的版本中可能要增加两阶段启动过程。
ResourceAdapter JavaBean表示一个资源适配器实例,并且包含相对应资源适配器实例的配置信息,这个配置信息对ManagedConnectionFactory或者ActivationSpec JavaBean来说可能也被使用作为全局缺省的配置信息。
一个资源适配器实例对于多个企业信息系统实例来说可能提供双向的链接。一个ManagedConnectionFactory JavaBean能被使用来提供对单个的企业信息系统的输出连接。一个ActivationSpec JavaBean能被使用来提供来自企业信息系统的输入连接;一个资源适配器实例可能包括几个ManagedConnectionFactory和ActivationSpec JavaBean。
² 一个ManagedConnectionFactory JavaBean就表示通过资源适配器从应用到企业信息系统实例的一个输出链接。同时也包含相应的输出连接配置信息,该配置信息是是继承ResourceAdapter JavaBean的配置信息的,也就是说输出连接的配置信息是ResourceAdapter JavaBean和ManagedConnectionFactory JavaBean两者配置信息的综合,并且ManagedConnectionFactory的配置信息可能覆盖ResourceAdapter的配置信息(在两者中都存在相同名称的配置信息时)。
² 输出连接是由应用服务器发起的,并且必须创建一个ManagedConnectionFactory JavaBean和ResourceAdapter JavaBean之间的一个关联,建立关联是通过调用RsourceAdapterAssociation接口的setResourceAdapter方法来做到的,ResourceAdapterAssociation接口指明ManagedConnectionFactory JavaBean和ResourceAdapter JavaBean之间的关联关系。setResourceAdapter至少要调用一次,也就是说这个关联也是可以改变的。
² 一个ActivationSpec JavaBean表示通过资源适配器实例从企业信息系统到应用服务器的输入连接,它也同样包含输入连接的配置信息,该配置信息也是ResourceAdapter JavaBean和ActivationSpec JavaBean的综合。输入连接是由企业信息系统发起的。ActivationSpec JavaBean也必须和ResouceAdapter JavaBean关联,因为不管是输出连接还是输入连接都是通过ResourceAdapter这个中间桥梁来建立连接的。也是通过setResourceAdatper方法来达到关联的目的的。
² 资源适配器实例关闭需要经过两个阶段:第一阶段应用服务器停止所有使用此资源适配器实例的应用组件,直到所有的应用线程不在使用此资源适配器实例。第二阶段是调用ResourceAdapter JavaBean的stop方法来通知资源适配器实例停止服务。
3、 连接管理
A) 应用程序组件通过JNDI找到连接工厂ConnectionFactory
B) ConnectionFactory将创建连接的请求传给ConnectionManager实例。
C) ConnectionManager接收到连接工厂的请求之后,查询由应用服务器提供的连接池,如果有符合要求的连接在池中就将匹配的ManagedConnection实例来满足连接请求,直接返回给连接工厂,然后连接工厂返回给应用组件,如果没有符合要求的连接在池中,应用服务器就使用ManagedConnectionFactory接口的实现类(在资源适配器中实现)来创建一个新的到企业信息系统的底层物理连接,应用服务器将这个新创建的ManagedConnection实例放到连接池中,并且注册一个ConnectionEventListener实现到ManagedConnection实例中,这个监听器可以使应用服务器得到关于ManagedConnection实例状态改变的通知。然后返回给应用组件。
4、 事务管理
5、 安全框架
6、 未完待续