1) Is is possible to manipulate messages in a queue/topic? We want to be able to delete messages.
There are third-party tools, like HermesJMS, you can use.
If all you want to do is delete certain messages using a message selector, then writing a trivial MBean to do so would be simple.
3) The message payload may consist of multiple MB's (even GB's in a few cases) and we are concerned with the performance when messages are consumed. Any possibility to lazy-load when consuming messages?
I imagine almost all messaging servers require that a message reside in memory when processing it, so you have to take that into consideration when dealing with 1GB+ messages.
You may want to stream the contents separately in a DB and then use small messages (pointers) to the actual contents.
4) What happens if a consumer fails to consume a message. Is the message put in the back of the queue? If so how is this done? By reference or by copying the object?
Of course, references to messages are used when processing them. They are only created once on the server, but are copied when sent to the client.
If you can store the real content via other ways, outside of jms, and use the jms messages as triggers to process them, you could gain some performance. We, e.g. use a shared filesystem between two applications for storing the data but all triggering etc is done in jms/mdb's