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]>


Odpovedet emailem