有状态会话 Bean (SFSB) 包含特定于客户机的状态。客户机和有状态会话 Bean 之间存在一对一关系。创建时,EJB 容器赋予每个 SFSB 唯一的会话 ID,以便将其绑定到客户机。
服务器实例出现故障时,SFSB 的状态可以保存在持久性存储中。在 SFSB 的生命周期中,其预定义点处的状态将被保存到持久性存储库中。这称为检查点操作。如果已启用,通常会在 Bean 完成了任意事务之后(即使该事务回滚)执行检查点操作。
但是,如果 SFSB 参与了 Bean 管理的事务,则该事务可能会在 Bean 方法执行的中间就被提交。由于 Bean 的状态可能因方法调用而发生转换,因此这不是对 Bean 的状态进行检查点操作的适当时间。在此情况下,EJB 容器将在相应方法结束时对 Bean 的状态进行检查点操作,前提是当该方法结束时,该 Bean 不在另一个事务的范围内。如果 Bean 管理的事务涉及多个方法,则检查点操作将被延迟,直至在后继方法结束时没有活动的事务。
SFSB 的状态并不一定具有事务性,并且可能因非事务性业务方法而被显著修改。如果某个 SFSB 出现这种情况,则您可以指定一系列检查点方法,如指定对其执行检查点操作的方法所述。
如果可分布的 Web 应用程序引用了 SFSB,并且 Web 应用程序的会话发生故障转移,则 EJB 引用也将进行故障转移。
如果停止 Application Server 实例时取消部署使用会话持久性的 SFSB,则持久性存储中的会话数据可能不被清除。要避免这种情况,请在运行 Application Server 实例时取消部署 SFSB。
选择“EJB 容器可用性”选项卡。
选中“可用性服务”框。
要禁用可用性,请取消选中该框。
更改其他设置,如可用性设置中所述。
单击“保存”按钮。
重新启动服务器实例。
要启用 EJB 容器的可用性,请使用 asadmin set 命令设置以下三个配置属性:
availability-service.ejb-container-availability.availability-enabled
availability-service.ejb-container-availability.sfsb-persistence-type
availability-service.ejb-container-availability.sfsb-ha-persistence-type
例如,如果 config1 为配置名称,请使用以下命令:
asadmin set --user admin --passwordfile password.txt --host localhost --port 4849config1.availability-service.ejb-container-availability.availability-enabled="true"
asadmin set --user admin --passwordfile password.txt --host localhost --port 4849config1.availability-service.ejb-container-availability.sfsb-persistence-type="file"
asadmin set --user admin --passwordfile password.txt --host localhost --port 4849config1.availability-service.ejb-container-availability.sfsb-ha-persistence-type="ha"
HADB 软件随 Sun Java System Application Server 的 Application Server 独立分发提供。有关 Sun Java System Application Server 的可用分发的信息,请参见《Sun Java System Application Server 9.1 Installation Guide》中的“Distribution Types and Their Components”。HADB 功能仅在企业配置文件中可用。有关配置文件的信息,请参见《Sun Java System Application Server 9.1 管理指南》中的“用法配置文件”。
通过“可用性服务”的“EJB 容器可用性”选项卡,您可以更改这些设置:
HA 持久性类型:为已启用可用性的 SFSB 指定会话持久性和钝化机制。允许的值有 file(文件系统)、replicated(其他服务器上的内存)和 ha (HADB)。默认值是 ha。对于需要会话持久性的生产环境,请使用 ha 或 replicated。
SFSB 持久性类型:为尚未启用可用性的 SFSB 指定钝化机制。允许的值有 file(默认值)、replicated 和 ha。
如果将任一持久性类型设置为 file,EJB 容器都将指定用于存储已钝化的会话 Bean 状态的文件系统位置。文件系统的检查点操作对于测试很有用,但不适用于生产环境。有关配置存储属性的信息,请参见管理控制台联机帮助。
HA 持久性可以允许服务器实例的群集在任何服务器实例出现故障时恢复 SFSB 状态。HADB 还可以用作钝化和活化存储。在要求 SFSB 状态持久性的生产环境中使用此选项。有关更多信息,请参见 configure-ha-cluster(1)。
SFSB 存储池名称:如果更改了用于连接 HADB 的 JDBC 资源以获得会话持久性,您可以更改 SFSB 存储池名称。有关详细信息,请参见 configure-ha-cluster(1)。
如果已禁用可用性,本地文件系统将用于 SFSB 状态钝化而非持久性。要更改 SFSB 状态的存储位置,请更改 EJB 容器中的“会话存储位置”设置。有关配置存储属性的信息,请参见管理控制台联机帮助。
您可以在部署期间启用单个应用程序或 EJB 模块的 SFSB 可用性:
如果要使用管理控制台进行部署,请选中“启用可用性”复选框。
如果要使用 asadmin deploy 或 asadmin deploydir 命令进行部署,请将 --availabilityenabled 选项设置为 true。有关更多信息,请参见 deploy(1) 和 deploydir(1)。
要为单个 SFSB 启用可用性并选择执行检查点操作的方法,请使用 sun-ejb-jar.xml 部署描述符文件。.
要启用高可用性会话持久性,请在 ejb 元素中设置 availability-enabled="true"。要控制 SFSB 高速缓存的大小和行为,请使用以下元素:
max-cache-size:指定高速缓存中容纳的会话 Bean 的最大数目。如果高速缓存溢出(Bean 的数目超过了 max-cache-size),则容器将钝化某些 Bean 或将 Bean 的序列化状态写入文件。创建文件的目录可以使用配置 API 从 EJB 容器处获取。
resize-quantity
cache-idle-timeout-in-seconds
removal-timeout-in-seconds
victim-selection-policy
有关 sun-ejb-jar.xml 的更多信息,请参见《Sun Java System Application Server 9.1 Application Deployment Guide》中的“The sun-ejb-jar.xml File”。
<sun-ejb-jar> ... <enterprise-Beans> ... <ejb availability-enabled="true"> <ejb-name>MySFSB</ejb-name> </ejb> ... </enterprise-Beans> </sun-ejb-jar>
如果已启用,通常会在 Bean 完成了任意事务之后(即使该事务回滚)执行检查点操作。要指定非事务性业务方法(导致对 Bean 状态的重要修改)结束时 SFSB 的其他可选检查点操作,请使用 sun-ejb-jar.xml 部署描述符文件的 ejb 元素中的 checkpoint-at-end-of-method 元素。
checkpoint-at-end-of-method 元素中的非事务性方法可以是:
在 SFSB 的主接口中定义的 create() 方法(如果要在创建后立即对 SFSB 的初始状态进行检查点操作)
对于仅使用容器管理的事务的 SFSB,Bean 的远程接口中使用事务属性 TX_NOT_SUPPORTED 或 TX_NEVER 进行标记的方法
对于仅使用 Bean 管理的事务的 SFSB,既不启动也不提交 Bean 管理的事务的方法
此列表中提到的所有其他方法均忽略。当调用这些方法结束时,EJB 容器会将 SFSB 的状态保存到持久性存储中。
如果 SFSB 没有参与任何事务,并且没有在 checkpoint-at-end-of-method 元素中明确指定其任何方法,则将不对 Bean 的状态进行检查点操作(即使对于此 Bean,已设置 availability-enabled="true")。
请指定方法的较小子集以获得更好的性能。方法应完成大量工作或导致对 Bean 状态的重要修改。
<sun-ejb-jar> ... <enterprise-Beans> ... <ejb availability-enabled="true"> <ejb-name>ShoppingCartEJB</ejb-name> <checkpoint-at-end-of-method> <method> <method-name>addToCart</method-name> </method> </checkpoint-at-end-of-method> </ejb> ... </enterprise-beans> </sun-ejb-jar>