IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  WebSphere  >

侦听器端口上的最大会话属性如何影响 WebSphere Application Server 性能

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

Sanjay M Kesavan (sanjay_mk@in.ibm.com), WebSphere MQ Java/JMS Level 3 Support, IBM

2006 年 2 月 08 日

本文介绍在 IBM® WebSphere® Application Server 中配置侦听器端口以使性能和吞吐量最大化时应该注意的基本事项。

引言

在 IBM WebSphere Application Server(V5 和 V6)中使用消息驱动 bean 时,理解以下两点是很重要的:如何控制并行处理的消息数量,以及它对消息吞吐量和应用服务器性能有何影响。

在本文中,我们讨论在点到点域中运行的消息驱动 bean (MDB)。发布/订阅域和混合域(JMS 1.1 规范中的一个新特性)中的关系也是如此。





回页首


池、端口和属性

连接池

JMS 应用程序通过队列连接工厂创建队列连接来与 JMS 提供程序通信。WebSphere Application Server 对这些连接进行池化以提高 JMS 应用程序的性能。连接池避免了与消息传递中间件连接(以及后面的断开连接)时的性能开销。

当应用程序调用 QueueConnectionFactory.createQueueConnection() 时,应用服务器将检查连接池中是否有连接到工厂使用的队列管理器的空闲连接可用。如果发现空闲连接,则将其标记为 in use 并返回给应用程序。如果池中所有连接都在使用中,或者 createQueueConnection() 方法首次在连接工厂上调用,则会创建一个新的连接并返回给应用程序。连接池将维护此新连接的引用,并将其标记为“in use”。

如果池中总连接数达到最大,则 QueueConnectionFactory.createQueueConnection() 方法将等待“in use”连接变为可用。对于这种情况,该方法等待连接的最大等待时间是由连接池的连接超时属性指定的。

会话池

队列会话是使用 QueueConnection.createQueueSession() 方法从队列连接创建的。为了提高性能,这些会话也维护在一个池中(会话池)。

每个队列连接都有一个与之相关联的会话池。这意味着,如果在连接池中最多有两个连接,在会话池中最多有四个会话,则对于此队列连接工厂可以有多达八个会话;也意味着,对于此队列连接工厂,每个连接最多只有四个会话。

侦听器端口

侦听器端口充当一个 JMS 应用程序,它传递消息给 MDB 的 onMessage() 方法。您可以认为侦听器端口是一个使用 MDB(实现 javax.jms.MessageListener 的对象)来进行异步消息传递的应用程序。

如果侦听器端口的 initial state 属性是 started,则应用服务器在启动时将启用此侦听器端口。如果 MDB 配置为使用该侦听器端口,则它将立即开始处理队列中的任何消息。消息的处理速度部分取决于该侦听器端口的最大会话属性值。

侦听器端口的最大会话属性

对于侦听器端口,最大会话属性直接与并发运行的 MDB 实例数相关联。

消息侦听器服务中的线程池

消息侦听器服务是一个监视侦听器端口的内部线程;它控制侦听器端口将使用的线程数。通过此属性,我们可以设置消息侦听器服务用于运行侦听器端口的最大和最小线程数。这与最大会话属性有直接关系,并因此与 MDB 的吞吐量也有关系。





回页首


这些属性如何一起工作?

图 1 显示了连接池、会话池、线程池和最大会话属性之间的关系。


图 1. 连接工厂和消息侦听器服务之间的关系
图 1. 连接工厂和侦听器服务之间的关系

让我们看一下图 1 中 MDB 的具体状态。配置设置如下:

  • 我们定义了两个队列连接工厂 (QCF):jms/QCF1 和 jms/QCF2。每个 QCF 都有一个连接池(最大连接属性设置为 2)和一个会话池(最大会话设置为 4)。这表明对于连接池中的每个连接,会话池中都有四个会话,如图中虚线所示。

  • 消息侦听器服务配置为使用最大线程属性设置为 4 的线程池。

  • 我们有两个侦听器端口:ListenerPort1 和 ListenerPort2。

  • 我们有两个 MDB:MDB1 和 MDB2,它们分别配置为使用 ListenerPort1 和 ListenerPort2。

  • ListenerPort1 在配置时将最大会话设置为 2。QCF 的 JNDI 设置是 jms/QCF1。

  • ListenerPort2 在配置时将最大会话设置为 1。QCF 的 JNDI 设置是 jms/QCF2。

我们来检查一下 MDB1 的当前状态。

MDB1 运行时具有两个会话,因为 ListenerPort1 的最大会话属性设置为 2。这将导致 MDB 使用消息侦听器服务线程池中的两个线程来处理消息。Thread1 使用 Session1 来将消息传递到 MDB1 的一个实例,而 Thread2 使用 Session2 来将消息传递到 MDB1 的第二个实例。如果在 ListenerPort1 启动时队列中有两个消息,则这两个消息将并行处理。

假设我们将最大会话设置为 4。如果在消息侦听器服务线程池中有足够的线程,则将看到四个线程并行处理消息。只有当队列中需要处理的消息太多时才会创建新的 MDB 实例且发起新的线程。如果消息到达队列的频率非常低(例如,一个消息到达后,另一个消息在几分钟后才到达队列),则可能看到任何时候都只有一个线程处于活动状态。

在熟悉此示例后,注意以下几点是很重要的:

  • 侦听器端口将始终使用连接池中的一个连接运行。此连接只有在侦听器端口停止后才释放。

  • 即使侦听器端口的最大会话属性设置为一个较大的值,您也可能无法看到并发处理消息的会话数。如果会话池中没有足够的会话——或者消息侦听器服务线程池中没有足够线程——则创建的 MDB 实例数将会是空闲线程或空闲会话的最小值。

    例如,在本例中,如果我们将 ListenerPort1 中的最大会话设置为 4,则将只有三个线程并行处理。这是因为在线程池中只有一个线程空闲,即使在会话池中有两个空闲会话(假定用于 MDB2 的 ListenerPort2 线程是在 ListenerPort1 线程试图启动之前启动的;否则,MDB2 只有在 MDB1 之一处理完成后才会启动)。

  • 侦听器端口线程使用的会话将在完成消息处理(执行或回滚)后释放。在这之前,侦听器端口使用的会话对其他任何应用程序都不可用。

  • MDB 的吞吐量与侦听器端口线程启用的 MDB 实例的数量直接相关。如果最大会话属性设置得太高,则将创建大量 MDB 实例,这可能影响应用服务器的性能。

现在,我们来看一下 MDB2 的当前状态。

MDB2 配置为使用最大会话设置为 1 的 ListenerPort2。这意味着侦听器端口将使用 jms/QCF2 连接池的 Thread3 和 Session1 来处理消息。这更像是连续处理。有关在 MDB 中实现连续消息处理的更多细节,请参考文章 Configure WebSphere Application Server to make message-driven beans process messages in a strict order





回页首


结束语

本文解释了最大会话属性的行为及其与消息侦听器服务线程池、连接池和会话池的关系。文中介绍了这几部分的内容以及在 WebSphere Application Server 中配置消息驱动 bean 时它们如何一起工作才能实现最佳性能。



参考资料



关于作者

Sanjay M Kesavan 具有 11 年以上的 IT 经验,他于 2000 年加入 IBM。从那时起,他就一直从事 WebSphere MQ 和 WebSphere Application Server 的相关工作,目前他是 Websphere MQ Java/JMS Level 3 Support 团队中的一员。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款