Bonjour,
voila en gros je voulais réaliser un EJB qui reçoit des messages JMS (MDB).
Mais je n'arrive pas à configurer correctement la gestion des transactions et j'aurais bien besoin d'un peu d'aide.
Je veut 1 consomé mon message si il y a une erreur JMS de ne pas le consomé
2 de mettre à jour ma base de donnée, mais si il y a une erreur (sql par exemple), je veut que le message soit consomé quand même.
Pour l'instance mon code onMessage resemble à celui-ci :
Au début, j'avais mis un type de transaction à Container mais du coup j'avais pas le droit d'appeler getUserTransaction selon Weblogic.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 public void onMessage(Message inMessage) { TextMessage msg = null; try { // Check messages is a text one if (inMessage instanceof TextMessage) { // Retrive messages msg = (TextMessage) inMessage; sr = new StringReader(msg.getText()); inMessage.acknowledge(); } } catch (Exception e) { // Tell we are going to rollback mdc.setRollbackOnly(); } // Try to use the messages // If KO then trash messages UserTransaction utx = mdc.getUserTransaction(); try { // begin transaction utx.begin(); superClassWhichUpdateDatabse.call(); // end transaction utx.commit(); } catch (Throwable te) { try { utx.rollback(); } catch(Exception e) { } } }
Mais j'ai lut que je ne pouvait pas utilisé Bean en type de transaction sinon je ne pourrait pas empêcher la consommation du message.
Au depart, j'avais indiqué que mon MDB ne supportait pas les transactions, du coup je pensait que je pourrait tout géré en développant...
Bon comme vous voyez j'ai pas les idée très claire sur ce sujet alors si vous avez une idée de comment faire je suis preneur.
-----------
La solution : J'ai écrit un autre EJB qui est dans une autre transaction. L'EJB qui lit les messages fait appel à l'autre EJB (la transaction est requiredNews)
Partager