Oprettet tor. d. 03. april 2008 kl. 10:16:17

fredand
fredand (7.140 point. Point ude: 180)

Why does my Exception not make a rollback?

Hello!

I got an MDB registred in a WLS 8.1.5 that consumes messages from a queue in my MQ 5.3.

I use Bean-manged-transaction for the MDB, and the code/logic looks like:

onMessage(Message m)
{
UserTransaction userTransaction = context.getUserTransaction();
try
{
userTransaction.begin();
//Exception test
if(1==1)
{
throw new Exception("Testing rollback");
}
userTransaction.commit();
catch(Exception e)
{
e.printStackTrace();
try
{
userTransaction.setRollbackOnly();
userTransaction.rollback();
}
catch (Exception e2)
{
e2.printStackTrace();
}
//Exception below should rollback onMessage
throw new RuntimeException();
}
}


What I expected to happen was that when a message arrives at my queue in MQ the MDB start to consume it.
But when the RuntimeException is thrown, the onMessage will not reurn succesfully.
Then the message should not have been consumed and should remain at the queue in MQ?

But when I try the message gets consumed and disappear.

Any comments is most welcome.

My mdb-tag in ejb-jar.xml looks like
      <message-driven >
        <ejb-name>MqMDB</ejb-name>
        <ejb-class>mytest.MqMDB</ejb-class>
        <transaction-type>Bean</transaction-type>
        <acknowledge-mode>Auto-acknowledge</acknowledge-mode>
        <message-driven-destination>
            <destination-type>javax.jms.Queue</destination-type>
            <subscription-durability>NonDurable</subscription-durability>
        </message-driven-destination>
      </message-driven>

My mdb-tag in weblogic-ejb-jar.xml looks like

  </weblogic-enterprise-bean>
  <weblogic-enterprise-bean>
      <ejb-name>MqMDB</ejb-name>
      <message-driven-descriptor>
        <pool>
            <max-beans-in-free-pool>1</max-beans-in-free-pool>
            <initial-beans-in-free-pool>1</initial-beans-in-free-pool>
        </pool>
        <destination-jndi-name>SP.BRKQM01.RES.L</destination-jndi-name>
        <initial-context-factory>com.sun.jndi.fscontext.RefFSContextFactory</initial-context-factory>
        <provider-url>file:/C:/testjndi</provider-url>
        <connection-factory-jndi-name>queue.connection.factory</connection-factory-jndi-name>
        <jms-polling-interval-seconds>10</jms-polling-interval-seconds>
      </message-driven-descriptor>
      <reference-descriptor>
      </reference-descriptor>
  </weblogic-enterprise-bean>

Best regards
Fredrik

Skrevet tor. d. 03. april 2008 kl. 20:04:53| #1

lborupj
lborupj (17.570 point)
Hi Fredrik,

You cannot use Bean Managed Transaction BMT and MDB's and expect a RuntimeException (or setRollbackOnly) to span the MQ resources and hence acknowledgement of messages. If you use BMT, acknowledgement of received messages are handled out-side the scope of the onMessage (and UserTransaction), so its basically not possible to get the message redelivered. You have to go CMT to get this to work, but remember to include MQ in a 2PC transaction, you have to use the client extension from IBM, otherwise you might want to use a MessageBridge (in BEA) to move the message from MQ to a local JMS queue, and let that take part in a transaction.

Cheers, Lars Borup Jensen
http://www.it-arbejde.dk

Skrevet ons. d. 29. december 2010 kl. 21:17:19| #2

fredand
fredand (7.140 point)
Hello Lars!

Please leave a svar so I can reward you!

Btw, thanks for a great explanation!

/Fredrik

Skrevet tor. d. 30. december 2010 kl. 17:32:25| #3

lborupj
lborupj (17.570 point)
Hi Fredrik,

Sure - here you go!

Regards, Lars Borup

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Kessler vs Green live streaming video coverage on Fox...

Oprettet den 19. maj 2012 kl. 23.19
rahman8910 giver 30 point for svar | Giv et svar »

How to implement many to many relationship with hibernate?

Oprettet den 11. maj 2012 kl. 16.32
fredand giver 60 point for svar | Giv et svar »

How to migrate validate="false" from struts1 to struts2

Oprettet den 30. april 2012 kl. 11.04
fredand giver 30 point for svar | Giv et svar »



   




Tips & Tricks fra PC World

Teaser billede

Læserne: Her er vores værste it-indkøb

Det er ikke al it-udstyr, som er det rene guld. Her er nogle af læsernes skrækhistorier.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan siger du farvel til Facebook

Læs her, hvordan du dropper Facebook og i stedet anvender nogle brugervenlige alternativer, så du stadig kan være social på nettet.


Nyheder fra Computerworld

Teaser billede

Galleri: De fedeste håndholdte gennem 40 år

Her har du de mest banebrydende håndholdte computere gennem alle tider.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger