Transactional message driven beans were originally designed to receive one message per transaction. However I have a faint recollection that people have sometimes complained that this is too limiting...

It doesn't have to be this way....

Normally transactional message delivery to an mdb has transactions managed by the receiving ejb container. The inbound connector says its about to deliver a message, the container starts the tx, the message gets delivered, and the transaction completes.

However there's also a transaction import capability for inbound connectors. If the broker had some way to generate appropriate xids (such as a tm running inside it) it could start a transaction, deliver a bunch of messages, and complete the transaction itself. There are (at least) two resource managers involved -- the broker and the mdb container -- so xa transactions are really required for reliability, but it might be possible to use the brokers journal as the tx log to reduce the overhead. (basically this involves writing the prepare record for the broker last, at which point it serves as the tx manager "prepared" record as well -- you need to include a little extra info in the record for this to work)

Implementation details aside, is this something anyone would use or is it just a useless product of my fevered imagination?

I could see two obvious uses --

1. receiving all messages in a message group in one tx. I think this would require either knowing how many messages are in the group to start with or somehow flagging the last message in the group. 2. batching receives to reduce the overhead of transactions. If transactions never roll back except for system errors then the overhead of transaction management can be spread over 10 or 100 messages while maintaining transactional reliability.

many thanks
david jencks

Reply via email to