问题标签 [atomikos]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1002 浏览

java - 2 个 JMS 代理 (ActiveMQ) 之间的 XA 事务

我正在尝试在 2 个不同的远程 activeMQ 代理之间移动 jms 消息,并且经过大量阅读

我正在使用 Atomikos,因为我正在编写一个独立的应用程序,并且我也在使用 spring 来使整个工作正常。

我有以下 bean javaconfig 设置

在我启动 DMLC 之前,2 AtomikosConnectionFactoryBean 在运行时包装了一个 ActiveMQXAConnectionFactory(每个代理一个)。

然后,我使用以下方法设置了一个简单的 messageListener(在 dmlc 启动之前分配给它):

应用程序在没有任何特定错误或警告的情况下启动,但是一旦我将消息放入源队列中,我可以通过日志看到 onMessage 方法正在一遍又一遍地运行同一条消息,就好像事务一直在回滚并再次重新启动(不会在任何地方抛出错误)。

我还注意到,如果我碰巧使用相同的源 url 和目标 url(意味着相同的代理,但每个代理都有自己的 connectionFactory),它会工作并且消息会按预期在源队列和目标队列之间传输。

我想知道的是

  1. 我在设置中做错了什么?为什么我的事务“似乎”在使用 2 个不同的代理时一遍又一遍地回滚,但在使用相同的代理(但超过 2 个不同的连接工厂)时工作?
  2. 我不完全相信 onMessage 当前正在执行正确的事务,因为我目前正在捕获所有异常并且什么都不做,我相信这将在 jmstemplate 完成发送消息之前提交 dmlc 的事务,但我不确定。如果是这种情况,SessionAwareMessageListener 会更好吗?我应该在 onMessage 方法中设置@Transacted 吗?

任何人都可以帮助阐明这个问题吗?欢迎所有输入。

更新:

我意识到“回滚”的问题是由于我使用的两个 AMQ 都是通过代理网络相互连接的,而且我碰巧对源和目标使用了相同的队列名称。这导致应用程序将消息从一个 AMQ 传输到另一个 AMQ,然后立即,因为源 AMQ 上有一个消费者,消息将被传输回原始 AMQ,而原始 AMQ 又被视为我的应用程序发出新消息并再次传输,循环无限进行。下面发布的解决方案有助于解决其他问题。

0 投票
0 回答
203 浏览

java - 事务超时问题,因为数据库被锁定

我们有两个数据库,一个是主数据库,另一个是从数据库。我们在两个数据库中放置了 2 个锁,为了使它们同步,我们在其上放置了一个独占锁。

现在的问题是,更新主数据库表中的行时,计时器已过期。由于这个问题,主表锁已失效,但我们在从表中仍然有一个锁,在两个表中都有排他锁。因此,我们无法更新表中的行。我们不知道为什么主数据库中的锁死了,而全局锁仍然没有释放该行。

我试过setReapTimeout()方法。它也没有工作。有人可以帮忙吗...

Atomikos 错误:

0 投票
0 回答
949 浏览

tomcat - Tomcat、Websphere MQ 和 Atomikos:无法集成事务管理器

采取的步骤:

  1. 遵循链接 http://www.atomikos.com/Documentation/Tomcat7Integration35中提到的所有步骤 。将“atomikos-integration-extension-3.7.1-20120529.jar”复制到 TOMCAT_HOME/lib 文件夹中。

    湾。服务器.xml

    C。上下文.xml

    d。添加了所有必需的事务 jar。还有交易属性:

  2. 在代码中完成的更改,

一个。交易.xml:

ISSUE: 只有当我们尝试将消息推送到队列时,我们总是在日志中找到 No JTA TransactionManager。我们能够成功地进行数据库调用:

如果有人遇到过这个问题,请告诉我们您是如何解决的。

0 投票
3 回答
15974 浏览

spring-data-jpa - Spring boot + Spring Data JPA + Atomikos + 多数据库配置

使用此配置(MainConfig.java):

(CustomerConfig.java)

(OrderConfig.java)

(CustomerRepository.java)

(OrderRepository.java)

运行此测试时出现 NullPointerException:

空对象似乎是事务管理器,所以我想它没有正确注入。堆栈跟踪的相关部分在这里:

pom文件在这里:

Github 上提供了完整的代码:https ://github.com/fabiomaffioletti/mul-at我找不到任何工作示例,即使在查看Spring 博客文章后我也无法使其工作。有没有人有任何提示?

按照客户连接的spring boot的控制台日志:

0 投票
2 回答
1467 浏览

java - 为什么我使用 Spring Integration/JtaTransactionManager 看到多个事务

我正在开发一个使用 Spring Integration 框架和 atomikos 进行分布式事务构建的项目。最近我们一直在尝试运行集成测试来验证消息是否正确地通过我们的系统发送。在执行其中一个集成测试时,我注意到我们收到 10 条日志消息,指示正在创建新事务,还有 10 条日志消息指示事务提交。

每次消息从通道传递到端点时,Spring 是否都会创建新事务,反之亦然?

下面的代码接受消息驱动通道适配器上的消息(使用事务管理器)并发送到路由器。然后路由器将消息发送到包含转换器、服务激活器(带有 retryAdvice)和出站消息适配器的链。

AFAIK,当我们的消息驱动通道适配器从队列接收消息时,我应该看到一个事务创建,然后在它完成处理消息时提交。所以我认为总共会有 3 笔交易。一种来自在测试中发送消息,一种来自入站适配器,另一种来自在测试中接收消息。

来自 spring-datasource.xml

来自 spring-context.xml

消息端点

测试方法

日志

0 投票
0 回答
139 浏览

spring - 注册避免两阶段提交

我们在春天有我们的应用程序,很少有服务与 DB 和 jms 队列交互。我们使用 atomikos 来处理 2 阶段提交。

我的问题是,从设计的角度来看,如果我在服务执行结束时进行所有队列操作,那么将消息放入队列后出错的概率非常非常小,我还应该使用两阶段提交吗?

我在早期的项目中使用了 2 台 pc,并且总是觉得如果服务逻辑像上面那样协调得当,损坏数据的机会就会非常少。

当然可能会有失败的情况(如果由于网络或数据库故障而无法提交 txn,则将处理队列) - 但它们是无论如何都必须处理的主要问题。

请分享您的想法 - 通过组织服务逻辑,我们不能在上面只涉及一个 DB 和一个 jms 队列的简单场景中避免 JTA 吗?

感谢生活。 

0 投票
1 回答
1577 浏览

java - 事务未准备好(ActiveMQ),“XA 资源已变得不可用”(Atomikos),日志中无休止的异常

Atomikos (TransactionManager) 和 ActiveMQ 有问题。Atomikos 在 Spring 环境中用于启用 XA 事务。我们测试了 ActiveMQ 客户端的故障转移行为,并注意到一些不会消失的异常。我们的测试场景如下:

  • 启动两个使用相同数据库的代理,一个代理为主,第二个为从
  • 启动客户端;客户端将连接到主代理
  • 突然停止主代理(kill -9)
  • 发生故障转移到第二个代理,这有效

我们使用以下版本:

  • 活动MQ 5.10.0
  • Atomikos 3.9.3, 4.0.0M3, 3.9.7
  • Spring 3.2.4.RELEASE

现在我们从 Atomikos 得到以下异常:

发送部分的 Spring 配置如下所示:

Atomikos bean 配置如下:

这些异常会定期抛出。我们假设如下: Atomikos 向 ActiveMQ 代理发送一条准备语句。之后,经纪人被关闭。现在准备好的语句在 ActiveMQ 端丢失了,因此 Atomikos 将尝试恢复这个消失的事务。因为两个 ActiveMQ 代理使用相同的数据库,我们认为准备好的语句应该存储在数据库中。所以从代理可以恢复交易。但这不会发生。

有谁知道这是 ActiveMQ 的一个错误,还是 ActiveMQ 有一个“隐藏的”配置属性来启用 XA 事务的准备模式?

旁注:我们确保我们使用唯一 id 作为事务管理器名称(相关:关于 Atomikos 唯一 id 的 Stackoverflow 文章

谢谢。

0 投票
1 回答
616 浏览

transactions - 如何将 JTA 事务传播到不同的 JVM?

我有一个多域应用程序。每个域都是一个单独的 Spring 应用程序,提供服务并使用 JPA 访问它自己的数据库。我没有使用任何 Java EE 容器,只是使用 Jetty 将域作为 Web 应用程序运行。在我的项目中,要求能够在远程机器上安装这些域,这样我就不能将组件绑定到单个 JVM。我正在寻找的是一种通过网络在这些域之间进行可靠交易的方法。

例如。考虑到我们有一个计费和用户帐户处理域,我喜欢使新用户注册操作原子化,包括以下步骤:

  • 通过调用用户域的函数创建一个用户帐户
  • 通过调用计费域的函数记录用户的注册费用

如果其中一个步骤失败,我预计两个域的数据库都会回滚。

我目前正在根据这篇文章试用 JTA + Spring + Atomikos ,但是这只考虑了一个 JVM。我的目标是以这样的方式设置 Atomikos,如果在其自己的 JVM 中运行的域接受 JMS 消息,该消息是在调用者域中启动的 JTA 事务的一部分,并且此侦听器操纵域的数据库,则创建的数据库事务将参与JTA 事务也是如此。这样,对本地数据库所做的更改仅在 JTA 协调器提交全局事务时才提交,而不是在 onMessage 函数结束时本地提交。

这就是我目前停留的地方,因为我认为 Atomikos 可以单独实例化,而不仅仅是像上面的示例所示那样嵌入,并且 Spring 应用程序可以配置为使用此共享事务管理器在事务中注册资源。但我找不到任何教程,仅用于本地事务管理。

我正在寻找一些建议,或者 - 甚至更好 - 一个代码示例,它显示了我如何实现这一点。Atomikos 不是必需的,但我需要一个不付费的非 Java EE 解决方案。

0 投票
2 回答
7286 浏览

hibernate - 获取 javax.transaction.RollbackException: Prepare: NO vote with Atomikos JTA

我正在使用 Hibernate 和 Atomikos for JTA 作为我的概念证明之一。我收到 JTA 事务意外回滚异常,可能是由于超时。例外是:

javax.transaction.RollbackException: Prepare: NO vote

0 投票
1 回答
1385 浏览

spring - Atomikos XAResource 提出 0:未知

我使用以下方法为我们的单元测试设置了 JTA:

  • 阿托米科斯 (3.8)
  • 休眠 (3.2.6/3.3.2)
  • 弹簧 (3.1)

经过相当多的努力,我设法使用 HyperSQL 内存数据库、2 个 XA 数据源和 org.apache.naming.java.javaURLContextFactory 启动并运行它,用于设置 JNDI 注册表和以下 jta.properties:

在单元测试(注释为需要事务的类)中,我创建并用测试数据填充数据库(之前),在测试中我尝试获取表列表。

但是,在我执行了第一个 sql 语句(在 1 个 SQL 语句中创建模式、表和数据)之后,Atomikos 似乎关闭了我的连接,阻止我继续并从新表中获取内容列表。异常状态:

当我创建数据库并仅在此事务单元测试的一种测试方法中获取数据时,也会发生这种情况。

这篇文章建议向数据源 bean 添加一个测试查询,但是在这种情况下,这会导致无限循环无法找到任何工作连接。

因此我的问题是:如何防止 Atomikos 通过池中的 JDBCXAResource 连接关闭?

下面的一些测试日志显示我能够创建数据库,但之后无法再使用我的数据源: