Messaging engines can be stopped using a number of different mechanisms and with different degrees of urgency.
For each existing connection, the messaging engine waits for the current operation to complete, unless the operation is one that blocks within the messaging engine, such as a receive operation. In this case, the operation is interrupted. Asynchronous consumers are allowed to complete even though they may take an arbitrary amount of time to process the current message. The messaging engine then backs out of active transactions and disallows any further operations on that connection. When all connections are in this invalidated state, the messaging engine stops.
Force mode is like immediate mode, except that stopping the messaging engine interrupts messaging operations on application threads that taking place at the time that the stop command is issued. Rather than allowing existing messaging operations to complete, the messaging engine interrupts them and then disallows any further operations. When all connections are in this state, the messaging engine stops.
The intention of force mode is to complete the shutdown of the messaging engine in as short a time as possible. A subsequent restart of the messaging engine may take longer than if it had been stopped using immediate mode, because more recovery actions are needed. For example, force mode stop can leave messages in-doubt and you will need to deal with these messages as described in Resolving in-doubt transactions.
It is possible to escalate an immediate stop that is taking too long to force a stop.
Stop mechanism | Immediate | Force |
---|---|---|
Administrative console | Yes | Yes |
JMX stop command | Yes | Yes |
stopServer command | Yes | No |