• No results found

Tuning Message-Driven Beans 10

10.2 MDB Thread Management

Tuning Message-Driven Beans

10

[11]This chapter provides tuning and best practice information for Message-Driven Beans (MDBs) in WebLogic Server 12.1.3.

This chapter includes the following sections:

Section 10.1, "Use Transaction Batching"

Section 10.2, "MDB Thread Management"

Section 10.3, "Best Practices for Configuring and Deploying MDBs Using Distributed Topics"

Section 10.4, "Using MDBs with Foreign Destinations"

Section 10.5, "Token-based Message Polling for Transactional MDBs Listening on Queues/Topics"

Section 10.6, "Compatibility for WLS 10.0 and Earlier-style Polling"

10.1 Use Transaction Batching

MDB transaction batching allows several JMS messages to be processed in one container managed transaction. Batching amortizes the cost of transactions over multiple messages and when used appropriately, can reduce or even eliminate the throughput difference between 2PC and 1PC processing. See "Transaction Batching of MDBs" in Developing Message-Driven Beans for Oracle WebLogic Server .

Using batching may require reducing the number of concurrent MDB instances. If too many MDB instances are available, messages may be processed in parallel rather than in a batch. See Section 10.2, "MDB Thread Management".

While batching generally increases throughput, it may also increase latency (the time it takes for an individual message to complete its MDB processing).

10.2 MDB Thread Management

Thread management for MDBs is described in terms of concurrency—the number of MDB instances that can be active at the same time. The following sections provide information on MDB concurrency:

Section 10.2.1, "Determining the Number of Concurrent MDBs"

Section 10.2.2, "Selecting a Concurrency Strategy"

Section 10.2.3, "Thread Utilization When Using WebLogic Destinations"

Section 10.2.4, "Limitations for Multi-threaded Topic MDBs"

MDB Thread Management

10.2.1 Determining the Number of Concurrent MDBs

Table 10–1 provides information on how to determine the number of concurrently running MDB instances for a server instance.

Transactional WebLogic MDBs use a synchronous polling mechanism to retrieve messages from JMS destinations if they are either: A) listening to non-WebLogic queues; or B) listening to a WebLogic queue and transaction batching is enabled. See Section 10.5, "Token-based Message Polling for Transactional MDBs Listening on Queues/Topics".

10.2.2 Selecting a Concurrency Strategy

The following section provides general information on selecting a concurrency strategy for your applications:

In most situations, if the message stream has bursts of messages, using an unconstrained work manager with a high fair share is adequate. Once the

messages in a burst are handled, the threads are returned to the self-tuning pool.

In most situations, if the message arrival rate is high and constant or if low latency is required, it makes sense to reserve threads for MDBs. You can reserve threads by either specifying a work manager with a min-threads-constraint or by using a custom execute queue.

If you migrate WebLogic Server 8.1 applications that have custom MDB execute queues, you can convert the MDB execute queue to a custom work manager that has a configured max-threads-constraint parameter and a high fair share setting.

In WebLogic Server 8.1, you could increase the size of the default execute queue knowing that a larger default pool means a larger maximum MDB concurrency.

Default thread pool MDBs upgraded to WebLogic Server 9.0 will have a fixed maximum of 16. To achieve MDB concurrency numbers higher than 16, you will

Table 10–1 Determining Concurrency for WebLogic Server MDBs  Type of work manager or

execute queue Threads

Default work manager or unconstrained work manager

varies due to self-tuning, up to Min( max-beans-in-free-pool,16) Default work manager with

self-tuning disabled

Min(default-thread-pool-size/2+1,

 max-beans-in-free-pool)

This is also the default thread pool concurrency algorithm for WebLogic Server 8.1

Custom execute queue Min(execute-queue-size max-beans-in-free-pool, ) Custom work manager with

constraint

varies due to self-tuning, between min-thread-constraint

and Min( max-threads-constraint,

 max-beans-in-free-pool)

Note: Every application is unique, select a concurrency strategy  based on how your application performs in its environment.

Note: You must configure the max-threads-constraint parameter to override the default concurrency of 16.

MDB Thread Management

need to create a custom work manager or custom execute queue. See Table 10–1.

10.2.3 Thread Utilization When Using WebLogic Destinations

The following section provides information on how threads are allocated when WebLogic Server interoperates with WebLogic destinations.

Non-transactional WebLogic MDBs allocate threads from the thread-pool

designated by thedispatch-policy as needed when there are new messages to be processed. If the MDB has successfully connected to its source destination, but there are no messages to be processed, then the MDB will use no threads.

Transactional WebLogic MDBs with transaction batching disabled work the same as non-transactional MDBs except for Topic MDBs with a Topic Messages

Distribution Mode ofCompatibility (the default), in which case the MDB always limits the thread pool size to 1.

The behavior of transactional MDBs with transaction batching enabled depends on whether the MDB is listening on a topic or a queue:

–  MDBs listening on topics: — Each deployed MDB uses a dedicated daemon polling thread that is created in Non-Pooled Threads thread group.

* Topic Messages Distribution Mode = Compatibility: Each deployed MDB uses a dedicated daemon polling thread that is created in the Non-Pooled Threads thread group.

* Topic Messages Distribution Mode = One-Copy-Per-Server or One-Copy-Per-Application: Same as queues.

–  MDBs listening on queues — Instead of a dedicated thread, each deployed MDB uses a token-based, synchronous polling mechanism that always uses at least one thread from thedispatch-policy. See Section 10.5, "Token-based Message Polling for Transactional MDBs Listening on Queues/Topics".

For information on how threads are allocated when WebLogic Server interoperates with MDBs that consume from Foreign destinations, see Section 10.4.2, "Thread Utilization for MDBs that Process Messages from Foreign Destinations".

10.2.4 Limitations for Multi-threaded Topic MDBs

When thetopicMessagesDistributionMode isCompatibility, the default behavior for non-transactional topic MDBs is to multi-thread the message processing. In this

situation, the MDB container fails to provide reproducible behavior when the topic is not a WebLogic JMS Topic, such as unexpected exceptions and acknowledgement of messages that have not yet been processed. For example, if an application throws a

RuntimeException fromonmessage, the container may still acknowledge the message.

Oracle recommends setting max-beans-in-free-pool to a value of 1 in the

deployment descriptor to prevent multi-threading in topic MDBs when the topic is a foreign vendor topic (not a WebLogic JMS topic).

Best Practices for Configuring and Deploying MDBs Using Distributed Topics

Transactional MDBs automatically force concurrency to 1 regardless of the max-beans-in-free-pool setting.

10.3 Best Practices for Configuring and Deploying MDBs Using