8.11. 集群环境中的 Jakarta Enterprise Beans 事务

如果客户端代码调用集群 Jakarta Enterprise Beans,则会自动设置集群关联性。如果您在客户端管理事务,您可以选择以 集群中的特定节点为目标, 或者 允许客户端精细选择集群节点来处理事务。本节描述了这两个选项。

Jakarta Enterprise Beans Transactions 以特定节点为目标

您可以针对集群中的特定节点来按照以下步骤处理事务。

  1. 在创建 InitialContext 时,使用 PROVIDER_URL 属性指定目标集群节点地址。

    props.put(Context.PROVIDER_URL, "remote+http://127.0.0.1:8080");
    ...
    InitialContext ctx = new InitialContext(props);
  2. 在客户端中,从 InitialContext 查找 the txn:RemoteUserTransaction

    UserTransaction ut = (UserTransaction)ctx.lookup("txn:RemoteUserTransaction");

    您可以通过将 PROVIDER_URL 属性设置为服务器的 URL,然后查找 up txn:User Transaction,然后查找 ttxn:UserTransaction,如下代码示例所示:

    final Hashtable<String, String> jndiProperties = new Hashtable<>();
    jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory");
    jndiProperties.put(Context.PROVIDER_URL, "remote+http://localhost:8080");
    final Context context = new InitialContext(jndiProperties);
    
    SecuredEJBRemote reference = (SecuredEJBRemote) context.lookup("txn:UserTransaction");

    在实际调用发生之前,UserTransaction 不会绑定到任何特定的目的地。在调用时,此 UserTransaction 绑定到整个事务生命周期中的相应目标。

    在开始 UserTransaction 前,您不需要知道节点名称或目的地。org.jboss.ejb.client.EJBClient.getUserTransaction() 方法为您提供一个远程 UserTransaction,它可根据第一次调用自动选择其目的地。从 Java 命名和目录接口查找远程 UserTransaction 的效果也相同。

    注意

    org.jboss.ejb.client.EJBClient.getUserTransaction() 方法已弃用。

  3. 当事务开始时,所有 Jakarta Enterprise Beans 调用都会在交易期间绑定到该特定节点,从而建立服务器关联性。
  4. 当事务结束时,服务器关联性会被释放,Jakarta 企业 Bean 代理会返回到一般的集群关联性。

Jakarta Enterprise Beans Transactions Lazily 选择节点

您可以允许客户端在与事务相关的第一次调用期间轻松选择集群节点来处理事务。这允许在群集间对事务进行负载平衡。要使用这个选项,请按照以下步骤操作。

  1. 不要在 InitialContext 中指定用于调用 Jakarta Enterprise Beans 的 PROVIDER_URL 属性。
  2. 在客户端中,从 InitialContext 查找 the txn:RemoteUserTransaction

    UserTransaction ut = (UserTransaction)ctx.lookup("txn:RemoteUserTransaction");
  3. 当事务开始时,将自动选择一个集群节点,建立服务器关联性,并在交易期间将所有 Jakarta Enterprise Beans 调用与该特定节点绑定。
  4. 当事务结束时,服务器关联性会被释放,Jakarta 企业 Bean 代理会返回到一般的集群关联性。