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 Programming WebLogic Enterprise JavaBeans.
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 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).
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:
This is also the default thread pool concurrency algorithm for WebLogic Server 8.1
Custom execute queue
Custom work manager with constraint
varies due to self-tuning, between min-thread-constraint and Min(max-threads-constraint, max-beans-in-free-pool)
Transactional MDBs with batching enabled create a dedicated polling thread for each deployed MDB. This polling thread is not allocated from the pool specified by dispatch-policy, it is an entirely new thread in addition to the all other threads running on the system. See Use Transaction Batching.
Selecting a Concurrency Strategy
The following section provides general information on selecting a concurrency stategy for your applications:
Every application is unique, select a concurrency stategy based on how your application performs in its environment.
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.
You must configure the max-threads-constraint parameter to override the default concurrency of 16.
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 need to create a custom work manager or custom execute queue. See Table 10-1.
Using Foreign Vendor MDBs
The following sections provide information on the behavior of WebLogic Server when using foreign vendor MDBs:
When using foreign MDBs, WebLogic Server determines conccurency as shown in Table 10-2.
Table 10-2 Determining Concurrency for Foreign Vendor MDBs
Same algorithm as for WebLogic MDBs
Concurrency is always one.
Same algorithm as for WebLogic MDBs.
Thread Utilization When Using Foreign MDBs
The following section provides information on how threads are allocated when WebLogic Server interoperates with foreign vendor MDBs:
Non-transactional MDBs use a foreign vendor's thread, not a WebLogic Server thread. In this situation, the dispatch-policy is ignored except for determining concurrency.
Transactional MDBs run in WebLogic Server threads. One additional thread is dedicated for each deployed MDB. Additional threads are set by the dispatch-policy.
When using foreign transactional MDBs, some foreign vendors require a permanently allocated thread per concurrent MDB instance. These threads are drawn from the pool specified by dispatch-policy and are not returned to the pool until the MDB is undeployed. Since these threads are not shared, the MDB can starve other resources in the same pool. In this situation, you may need to increase the number of threads in the pool.