第 5 章  Java EE Application Server Facilities


请阅读本章,了解如何利用 Java EE 基础架构,以方便其提供的工具。

5.1.  Enterprise Beans

CommandServiceBean 是一个 无状态的会话 bean,它通过在单独的 IaaS 上下文中调用 execute 方法来运行 Business Process Manager 命令。下表中总结了可用的环境条目和自定义资源:
Expand
表 5.1. 命令服务 Bean 环境
Name 类型 描述
JbpmCfgResource 环境条目 这是从中读取 lsblk 配置的 classpath 资源。可选,默认为 jbpm.cfg.xml
ejb/TimerEntityBean EJB 参考 这是实施调度程序服务的本地实体 bean 的链接。包含计时器的进程需要。
jdbc/JbpmDataSource 资源管理器参考 这是数据源的逻辑名称,它提供 JDBC 持久服务的连接。必须与 Hibernate 配置文件中的 hibernate.connection.datasource 属性匹配。
jms/JbpmConnectionFactory 资源管理器参考 这是提供 JMS 消息服务的 JMS 连接工厂的逻辑名称。包含异步持续的进程需要。
jms/JobQueue Message Destination Reference jBPM 消息服务将作业消息发送到此队列。为确保这是作业监听器 Bean 接收消息的队列,message-destination-link 指向通用逻辑目的地 JobQueue
jms/CommandQueue Message Destination Reference 命令监听程序 bean 从此队列接收消息。为确保可以将命令消息发送到的队列,message-destination-link 元素 指向一个常见的逻辑目的地 CommandQueue
CommandListenerBean 是一个消息驱动的 bean,它侦听 CommandQueue for command 消息。它将命令执行委托给 CommandServiceBean
消息的正文必须是可以实施 org.jbpm.Command 接口的 Java 对象。(消息属性(若有)将被忽略。 如果信息不是预期的格式,则会将其转发到 DeadLetterQueue,且不会进一步处理。如果目标引用不存在,则消息也会被拒绝。
如果收到的消息指定了 replyTo 目的地,命令执行结果将嵌套在 对象消息中,并在其中发送。
命令连接工厂环境引用 指向用来提供 Java 消息服务连接的资源管理器。
相反,JobListenerBean 是一个消息驱动的 bean,它侦听 JbpmJobQueue 用于作业消息,以支持 异步延续
注意
请注意,消息必须具有名为 jobId 的属性,类型为 long。此属性必须包含对数据库中待处理 Job 的引用。消息正文(如果存在)将被忽略。
此 bean 扩展 CommandListenerBean。它继承后者的环境条目以及可以自定义的资源引用。
Expand
表 5.2. 命令/作业侦听器 Bean 环境
Name 类型 描述
ejb/LocalCommandServiceBean EJB 参考 这是指向本地会话 Bean 的链接,它可在单独的 IaaS 上下文上执行命令。
jms/JbpmConnectionFactory 资源管理器参考 这是为生成结果消息提供 Java 消息服务连接的工厂的逻辑名称。对于指示回复目的地的命令消息是必需的。
jms/DeadLetterQueue Message Destination Reference 不包含命令的消息将发送到此处引用的队列。它是可选的。如果没有,则此类消息将被拒绝,这可能会导致容器恢复。
-   
Message Destination Reference 不包含命令的消息将发送到此处引用的队列。如果没有,则此类消息将被拒绝,这可能会导致容器恢复。 
TimerEntityBean 供企业 Java Bean 计时器服务 用于调度。当 bean 过期时,计时器执行将委派给 命令 service bean。
TimerEntityBean 需要访问 Business Process Manager 的数据源。Enterprise Java Bean 部署描述符没有定义实体 Bean 如何映射到数据库。(这保留给容器提供程序。) 在 JBoss Application Server 中,jbosscmp-jdbc.xml 描述符定义了数据源的 JNDI 名称和关系映射数据(如表和列名称)。
注意
JBoss CMP (容器管理的持久性)描述符使用全局 JNDI 名称(java:JbpmDS),而不是资源管理器引用(java:comp/env/jdbc/JbpmDataSource)。
注意
早期版本的 Business Process Manager 使用名为 TimerServiceBean 的无状态会话 Bean 与 Enterprise Java Bean 计时器服务交互。会话方法必须被取消,因为它会导致 cancelation 方法造成无法避免的瓶颈。由于会话 Bean 没有身份,计时器服务被强制迭代 所有 计时器,以查找它必须取消的计时器。
bean 仍可用于向后兼容。它在与 TimerEntityBean 相同的环境中工作,因此迁移很容易。
Expand
表 5.3. 计时器实体/Service Bean 环境
Name 类型 描述
ejb/LocalCommandServiceBean EJB 参考 这是本地会话 bean 的链接,它在单独的 192.168.1.0/24 上下文上执行计时器。

5.2. Cbus Enterprise 配置

以下配置项包含在 jbpm.cfg.xml 中:
<jbpm-context>
  <service name="persistence"
    factory="org.jbpm.persistence.jta.JtaDbPersistenceServiceFactory" />
  <service name="message"
    factory="org.jbpm.msg.jms.JmsMessageServiceFactory" />
  <service name="scheduler"
    factory="org.jbpm.scheduler.ejbtimer.EntitySchedulerServiceFactory" />
</jbpm-context>
Copy to Clipboard Toggle word wrap
JtaDb\":\"ServiceFactory 允许业务流程管理器参与 JTA 事务。如果现有事务正在进行,则 JTA 持久性服务"禁止";否则,它会启动新的事务。商业流程管理器的企业 Bean 配置为将事务管理委派给容器。但是,如果在没有事务处于活跃状态的环境中(如 Web 应用程序)创建一个 JbpmContext,则会自动启动新的名称。 JTA 持久性服务工厂 包含以下可配置字段。
isCurrentSessionEnabled
当它被设置为 true 时,Business Process Manager 将使用与持续 JTA 事务关联的"current" Hibernate 会话。这是默认的设置。(如需更多信息 http://www.hibernate.org/hib_docs/v3/reference/en/html/architecture.html#architecture-current-session,请参阅。)
利用上下文的会话机制,使用与应用程序其他部分相同的会话。通过调用 SessionFactory.getCurrentSession() 完成此操作。或者,通过将 isCurrentSessionEnabled 设置为 false 并通过 JbpmContext.setSession(session) 方法注入会话来提供 Hibernate 会话。这也确保,Choffon 使用与应用程序其他部分相同的 Hibernate 会话。
注意
Hibernate 会话可以注入到无状态会话 Bean 中(例如,通过持久性上下文)。
isTransactionEnabled
当它被设置为 true 时,Choffon 将通过 Hibernate 的事务 API 启动事务,使用 JbpmConfiguration.createJbpmContext() 方法提交它。(当 JbpmContext.close() 被调用时,Hibernate 会话将关闭。)
警告
当 Business Process Manager 部署为 EAR 时,这不是所需的行为,因此 isTransactionEnabled 被默认设置为 false。(详情请参阅 http://www.hibernate.org/hib_docs/v3/reference/en/html/transactions.html#transactions-demarcation。)
JmsMessageServiceFactory 通过利用通过 Java 消息服务接口公开的可靠的通信基础架构,向 JobListenerBean 提供 异步 持续消息。JmsMessageServiceFactory 会公开以下可配置字段:
connectionFactoryJndiName
这是 JNDI 初始上下文中 JMS 连接工厂的名称。默认为 java:comp/env/jms/JbpmConnectionFactory
destinationJndiName
这是将作业消息发送到的 JMS 目标的名称。它必须与 JobListenerBean 接收消息的目的地匹配。默认为 java:comp/env/jms/JobQueue
isCommitEnabled
这将指定 Business Process Manager 是否应该在 JbpmContext.close() 上提交 Java 消息服务会话。JMS 消息服务生成的消息永远不会在当前事务提交前接收;因此,服务创建的会话始终会被转换。默认值为 false,在使用中的 连接工厂 是 XA 功能时,因为 Java 消息服务会话生成的消息将由整个 JTA 事务控制。如果 JMS 连接工厂没有支持 XA,则此字段应设置为 true,以便 Business Process Manager 明确提交 JMS 会话的本地事务。
EntitySchedulerServiceFactory 用于调度业务进程计时器。它可以通过在事务通知服务上构建,以实现企业 Java Bean 容器提供的时间事件。EJB 调度程序服务工厂 具有以下可配置字段。
timerEntityHomeJndiName
这是 JNDI 初始上下文中 TimerEntityBean 的本地主页接口的名称。默认值为 java:comp/env/ejb/TimerEntityBean

5.3.  Hibernate Enterprise 配置

hibernate.cfg.xml 文件包括以下配置项:修改它们以支持其他数据库或应用服务器。
<!-- sql dialect -->
<property name="hibernate.dialect">
    org.hibernate.dialect.HSQLDialect
</property>

<property name="hibernate.cache.provider_class">
  org.hibernate.cache.HashtableCacheProvider
</property>

<!-- DataSource properties (begin) -->
<property name="hibernate.connection.datasource">
    java:comp/env/jdbc/JbpmDataSource
</property>
<!-- DataSource properties (end) -->

<!-- JTA transaction properties (begin) -->
<property name="hibernate.transaction.factory_class">
  org.hibernate.transaction.JTATransactionFactory
</property>
<property name="hibernate.transaction.manager_lookup_class">
  org.hibernate.transaction.JBossTransactionManagerLookup
</property>
<!-- JTA transaction properties (end) -->

<!-- CMT transaction properties (begin) ===
<property name="hibernate.transaction.factory_class">
  org.hibernate.transaction.CMTTransactionFactory
</property>
<property name="hibernate.transaction.manager_lookup_class">
  org.hibernate.transaction.JBossTransactionManagerLookup
</property>
==== CMT transaction properties (end) -->
Copy to Clipboard Toggle word wrap
hibernate.dialect 设置替换为您的数据库管理系统。(更多信息,请参阅 http://www.hibernate.org/hib_docs/v3/reference/en/html/session-configuration.html#configuration-optional-dialects。)
HashtableCacheProvider 可以替换为其他支持的缓存提供程序。(详情请参阅 http://www.hibernate.org/hib_docs/v3/reference/en/html/performance.html#performance-cache。)
从方框中,Chofft 被配置为使用 JTATransactionFactory。如果现有事务正在进行,则 JTA 事务工厂将使用它;否则,它会创建一个新的事务。Tailoring 企业 Bean 配置为将事务管理委派给容器。但是,如果在没有活跃事务(如 Web 应用程序)的上下文中使用 jBPM API,则会自动启动一个。
要防止在使用 容器管理的事务时意外的事务 创建,请切换到 CMTTransactionFactory。此设置可确保 Hibernate 始终查找现有的事务,并在找不到任何问题时报告问题。

5.4.  客户端组件

确保为直接针对那些能够利用企业服务的 Business Process Manager API 编写的客户端组件的部署描述符就位了适当的环境引用。以下描述符可以被视为客户端会话 Bean 的典型内容:
<session>

  <ejb-name>MyClientBean</ejb-name>
  <home>org.example.RemoteClientHome</home>
  <remote>org.example.RemoteClient</remote>
  <local-home>org.example.LocalClientHome</local-home>
  <local>org.example.LocalClient</local>
  <ejb-class>org.example.ClientBean</ejb-class>
  <session-type>Stateless</session-type>
  <transaction-type>Container</transaction-type>

  <ejb-local-ref>
    <ejb-ref-name>ejb/TimerEntityBean</ejb-ref-name>
    <ejb-ref-type>Entity</ejb-ref-type>
    <local-home>org.jbpm.ejb.LocalTimerEntityHome</local-home>
    <local>org.jbpm.ejb.LocalTimerEntity</local>
  </ejb-local-ref>

  <resource-ref>
    <res-ref-name>jdbc/JbpmDataSource</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>

  <resource-ref>
    <res-ref-name>jms/JbpmConnectionFactory</res-ref-name>
    <res-type>javax.jms.ConnnectionFactory</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>

  <message-destination-ref>
    <message-destination-ref-name>
        jms/JobQueue
    </message-destination-ref-name>
    <message-destination-type>javax.jms.Queue</message-destination-type>
    <message-destination-usage>Produces</message-destination-usage>
  </message-destination-ref>

</session>
Copy to Clipboard Toggle word wrap
以上环境引用可以绑定到目标操作环境中的资源,如下所示:请注意,JNDItest 名称与 Business Process Manager enterprise Bean 使用的值匹配。
<session>

  <ejb-name>MyClientBean</ejb-name>
  <jndi-name>ejb/MyClientBean</jndi-name>
  <local-jndi-name>java:ejb/MyClientBean</local-jndi-name>

  <ejb-local-ref>
    <ejb-ref-name>ejb/TimerEntityBean</ejb-ref-name>
    <local-jndi-name>java:ejb/TimerEntityBean</local-jndi-name>
  </ejb-local-ref>

  <resource-ref>
    <res-ref-name>jdbc/JbpmDataSource</res-ref-name>
    <jndi-name>java:JbpmDS</jndi-name>
  </resource-ref>

  <resource-ref>
    <res-ref-name>jms/JbpmConnectionFactory</res-ref-name>
    <jndi-name>java:JmsXA</jndi-name>
  </resource-ref>

  <message-destination-ref>
    <message-destination-ref-name>
        jms/JobQueue
    </message-destination-ref-name>
    <jndi-name>queue/JbpmJobQueue</jndi-name>
  </message-destination-ref>

</session>
Copy to Clipboard Toggle word wrap
如果客户端组件是一个 Web 应用程序,而不是企业 bean,则部署描述符将类似如下:
<web-app>

  <servlet>
    <servlet-name>MyClientServlet</servlet-name>
    <servlet-class>org.example.ClientServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>MyClientServlet</servlet-name>
    <url-pattern>/client/servlet</url-pattern>
  </servlet-mapping>

  <ejb-local-ref>
    <ejb-ref-name>ejb/TimerEntityBean</ejb-ref-name>
    <ejb-ref-type>Entity</ejb-ref-type>
    <local-home>org.jbpm.ejb.LocalTimerEntityHome</local-home>
    <local>org.jbpm.ejb.LocalTimerEntity</local>
    <ejb-link>TimerEntityBean</ejb-link>
  </ejb-local-ref>

  <resource-ref>
    <res-ref-name>jdbc/JbpmDataSource</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>

  <resource-ref>
    <res-ref-name>jms/JbpmConnectionFactory</res-ref-name>
    <res-type>javax.jms.ConnectionFactory</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>

  <message-destination-ref>
    <message-destination-ref-name>
        jms/JobQueue
    </message-destination-ref-name>
    <message-destination-type>javax.jms.Queue</message-destination-type>
    <message-destination-usage>Produces</message-destination-usage>
    <message-destination-link>JobQueue</message-destination-link>
  </message-destination-ref>

</web-app>
Copy to Clipboard Toggle word wrap
以上环境引用也可以与目标操作环境中的资源绑定,如这个代码示例:
<jboss-web>

  <ejb-local-ref>
    <ejb-ref-name>ejb/TimerEntityBean</ejb-ref-name>
    <local-jndi-name>java:ejb/TimerEntityBean</local-jndi-name>
  </ejb-local-ref>

  <resource-ref>
    <res-ref-name>jdbc/JbpmDataSource</res-ref-name>
    <jndi-name>java:JbpmDS</jndi-name>
  </resource-ref>

  <resource-ref>
    <res-ref-name>jms/JbpmConnectionFactory</res-ref-name>
    <jndi-name>java:JmsXA</jndi-name>
  </resource-ref>

  <message-destination-ref>
    <message-destination-ref-name>
        jms/JobQueue
    </message-destination-ref-name>
    <jndi-name>queue/JbpmJobQueue</jndi-name>
  </message-destination-ref>

</jboss-web>
Copy to Clipboard Toggle word wrap

5.5.  总结

现在,在本章中,您应该对使用 Java EE 基础架构提供的功能进行全面了解,并应该熟悉您公司环境中的部分测试。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat