... case of a BMT MDB if we call the method setRollBackOnly() the message is not redelivered( unlike the same case with CMT )
Yes, you're absolutely right. Now I can't remember what I'm was thinking this morning (perhaps it was too early

). In the case of BMT MDB, the Message that calls's the MDB CAN'T be part of the transaction, since the Bean Provider will start the transaction later. Therefore, the message CAN'T be redelivered because the transaction fails.
However, the container will acknowledge the message according to the "JMS-Acknowledge semantic"
(Spec 15.4.8)that means:
- No message redelivery for successful onMessage call
- Message redelivery in exception case (=> answer to your question a)
See also
Using the JMS API in a J2EE(TM) Application:
If a message-driven bean uses bean-managed transactions, the message receipt cannot be part of the bean-managed transaction, so the container acknowledges the message outside of the transaction. When you package a message-driven bean using the deploytool, the Message-Driven Bean Settings dialog box allows you to specify the acknowledgment mode, which can be either AUTO_ACKNOWLEDGE (the default) or DUPS_OK_ACKNOWLEDGE. If the onMessage method throws a RuntimeException, the container does not acknowledge processing the message. In that case, the JMS provider will redeliver the unacknowledged message in the future. Hope this helps (for me too

)
Severin