Jsem rád že vám to pomohlo. Teoreticky můžete znovu použít Connection a Session, nemělo by to být nic proti specifikaci, teď jsem zkoušel a chování je stejné jako když se vytvoří znovu. V JEE kontextu by ani nemělo moc vadit vytvářet Connection znovu, je to sice takový anti-pattern, ale aplikační server vám nedává normální ConnectionFactory, ale obalenou, která nevytváří Connection objekty, ale většinou je bere z poolu, takže to není tak drahé. Koukněte na https://community.jboss.org/wiki/ShouldICacheJMSConnectionsAndJMSSessions, sice staršího data, ale víceméně aktuální.
Zdraví, JS. Dne 27. srpna 2012 23:40 Jaroslav Hurdes <[email protected]> napsal(a): > 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]> 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] > > > > -- Jiri Sedlacek - [email protected]
