【问题标题】:How to support transaction/failover on jms?jms如何支持事务/故障转移?
【发布时间】:2014-04-01 02:06:52
【问题描述】:

在后端我想要原子事务,这意味着

try{
get database connection

update employee record;
update department record;
produces messages 1 on queue1
produces messages 2 on queue2
// some exception occured
}
finally{
connection.rollback();
// how to roll back the messages from queue
}

同样,如果消息代理关闭,我将如何确保消息一旦启动就会被删除。

我正在使用 ActiveMQ

【问题讨论】:

    标签: java transactions jms failover


    【解决方案1】:

    假设你有一个JmsSession来发送消息,你可以通过jmsSession.commit()jmsSession.rollback()来完成jms事务。

    如果你希望消息是持久化的,即jms服务器崩溃后可以投递,可以设置消息的投递方式为持久化:jmsMessageProducer.send(msg, DeliveryMode.PERSITENT)

    查看详情:

    http://docs.oracle.com/javaee/6/api/javax/jms/Session.html

    【讨论】:

    • 但是我将如何同步数据库和 jms 事务?
    • 您必须使用 JTA 使用分布式事务,这通常由 JEE 容器提供,例如JBoss,你用的是什么容器?
    • 我正在使用tomcat。如果有错误的db事务,我想要什么,也回滚jms事务/同样如果jms事务中有异常,回滚db事务
    • 您有 2 个选项:使用带有 JTA 的容器管理事务(Tomcat 不提供)或自己处理事务,即如果没有错误提交 JDBC/JPA 并提交 JMS 会话,则尝试/捕获,否则回滚两者。如果您需要绝对的一致性保证,您可能需要一个适当的分布式事务管理器 (JTA),它使用两阶段提交 docs.oracle.com/cd/B14099_19/web.1012/b14012/jta.htm
    • 我认为 EJB 提供了这种现成的事务管理。我不是说我会在这里使用 ejb,只是想知道
    猜你喜欢
    • 2015-10-31
    • 2021-10-13
    • 1970-01-01
    • 2011-09-12
    • 2012-03-28
    • 2016-05-01
    • 2010-11-06
    • 1970-01-01
    • 2019-09-28
    相关资源
    最近更新 更多