Děkuji za pomoc.
Problém byl v tom, že jsem si jms connection, session a messageProducer
vytvořil jen jednou a používal jsem je dokola. To vedlo k tmu, že
transakce nefungovaly. Když, ale při každé transakci znova volám
vytvoření connection , session, a messageProcucer, tak transakce funguji
OK. connectionFactory a destenation mám namapovány přes @Resource v EJB,
tak jak to máte ve vaši ukázce.
public ObjectMessage sendObjectMessage(Serializable content) throws
JMSException {
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(true,
Session.SESSION_TRANSACTED);
MessageProducer messageProducer =
session.createProducer(destination);
ObjectMessage message = session.createObjectMessage();
message.setObject(content);
messageProducer.send(message);
return message;
}
Jaroslav Hurdes
Dne 27.8.2012 21:52, Jiri Sedlacek napsal(a):
Zdravím,
použil jsem váš standalone.xml a z větší části i persistence.xml a
zkusil si problém nasimulovat u sebe a chová se to tak, jak vy byste
očekával - při vyhození výjimky se provede rollback transakce, zpráva
se neuloží do DB ani nedojde do fronty - není tedy vyčtena
Message-driven beanou.
Použil jsem velmi jednoduchou konfiguraci, servlet volá EJB, EJB
ukládá do db, pošle zprávu a vyhodí výjimku - nic se neuloží.
Celý kód tříd jsem vám uložil na pastebin:
Message-driven bean: http://pastebin.com/fr5Z2Htu
Session bean: http://pastebin.com/gEjjgjaS
persistence.xml: http://pastebin.com/G3UMmcTQ
JPA entity: http://pastebin.com/kMy8ghtg
volajici servlet: http://pastebin.com/DPzUybjE
Požadovaným způsobem funguje JBossAS 7 nejen s HornetQ, ale i s jinými
JMS providery, zkoušeli jsme to přímo v Red Hatu.
--JS.
Dne 27. srpna 2012 18:14 Jaroslav Hurdes <[email protected]
<mailto:[email protected]>> napsal(a):
Zdravím. Zkouším zprovoznit pod JBossem 7.1.1 ejb, které zapisuje
pomocí hiberante data do databáze a současně posílá data přes
HornetQ. Problém je, že když zapíší data do db a fronty a poté
dojde na trasakci k rollbacku, tak databázova data se správně
nezapíší, ale data poslaná přes frontu jsou odeslána ihned, aniž
by byla dokončena transakce a tudíž nereagují na rollback.
Potřeboval bych poradit s konfiguraci hibernate a hornetQ, tak aby
používali jednu transakci. Díky za jakékoli nasměrování. V příloze
posílám ještě standalone.xml, kde je konfigurace jms a datových
zdrojů. Jaroslav Hurdes
Ejb využívá
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
a fronta je získána a zprávy odesílány pomocí tohoto kódu
public static final String PARAM_DESTENATION_TYPE_NAME =
"destinationType";
public static final String PARAM_DESTENATION_TYPE_VALUE =
"javax.jms.Topic";
public static final String PARAM_DESTENATION_NAME = "destination";
public static final String PARAM_DESTENATION_VALUE =
"topic/avesEntityMessages";
public static final String RESOURCE_ADAPTER_NAME = "hornetq-ra";
public static final String CONNECTION_FACTORY_NAME = "java:/JmsXA";
Context ic = null;
ConnectionFactory cf = null;
Connection connection;
Session session;
MessageProducer messageProducer;
ic = LocalInitialContextProvider.getInitialContext();
cf = (ConnectionFactory)ic.lookup(CONNECTION_FACTORY_NAME);
Topic topic = (Topic)ic.lookup(PARAM_DESTENATION_VALUE);
connection = cf.createConnection();
session = connection.createSession(true, Session.SESSION_TRANSACTED);
messageProducer = session.createProducer(topic);
ObjectMessage message = session.createObjectMessage();
message.setObject(content);
messageProducer.send(message);
Konzumenti zpráv jsou MessageDrivenBeans
@MessageDriven(name = SecurityEventsService.NAME,
activationConfig = {
@ActivationConfigProperty(
propertyName = PARAM_DESTENATION_TYPE_NAME,
propertyValue =
PARAM_DESTENATION_TYPE_VALUE),
@ActivationConfigProperty(
propertyName = PARAM_DESTENATION_NAME,
propertyValue = PARAM_DESTENATION_VALUE)
})
@ResourceAdapter(RESOURCE_ADAPTER_NAME)
--
Jiri Sedlacek - [email protected] <mailto:[email protected]>