Last project we decided to use advanced queueing, Oracle's messaging system, for the asynchronous functionality of the application. In my opinion it is a great feature of the database. It offers multiple publisher/subscriber models, it is accessible from PL/SQL, java (jms), mail etc., it is multi-user and has and a lot of other features. Besides this it is really fast. However, to get acquainted with AQ takes some time. There is a lot of documentation, with examples and tutorials. But somehow it is not enough to understand it complete and get started. Especially the part about agents and the multiple subscriber model was so confusing, that we decided to use two queues instead of a multi-consumer queue.
Then we also experienced two bugs (or are they called intended behaviour?). 1) The use of object superclasses (using the NOT FINAL keyword) as the base-class for the queue resulted in unexpected behaviour. Often the Oracle session was killed trying to dequeue a message (enqueueing went fine by the way. Fortunately this is a known bug and could be found on metalink. The workaround for was to create wrapper classes and use these in the queue. 2) DO NOT delete records from the queue itself using the standard Oracle delete. If you do that you may possibly corrupt your database :-(((. Use the dequeue functionality instead. Unfortunately there is no api to empty an entire queue, so you have to write one yourself. It is just one of those examples that Oracle offers just barely enough functionality.
Conclusion
Personally I am very happy with advanced queueing. It is fast, has much functionality and seems to just do the job. Off course there are also some drawbacks. The implementation and documentation is at some points so confusing that it really takes some time to get used to. The other issue is that there are still some very irritating bugs
. All in all, in my opinion it really offers great functionality and I am looking forward to use it in a java/j2ee project.