CDI 事件观察器处理服务器崩溃和重新启动

2023-12-01

我正在尝试使用服务将一个项目持久保存在数据库中,并为后续服务触发 JMS 消息以获取持久保存的项目,以便它可以处理相同的项目。此特定操作发生在单个事务中。但由于有时存在竞争条件,第二个服务无法获取相应的项目,因为它尚未持久化。

我的用例非常常见,并且在各个论坛中有很多与此相关的讨论。此问题的一种解决方案是使用 CDI 事件。我也尝试过,并且可以解决部分问题。伪代码如下:

@Inject
@Transaction
private Event<Item> itemEvent;

public void handleItem(Item item) {
  //code to persist the item
  itemEvent.fire(item);
}

@Asynchronous
public void observeAfterTransactionCompletion(@Observes(during = TransactionPhase.AFTER_SUCCESS) @Transaction Item item) {
  //code to send JMS message to the second service
}

我唯一的问题是,当持久性成功并且事件被触发时,并且在观察者开始处理事件之前,如果 Jboss 服务器出现故障,第二个服务将不会收到通知,因为 JMS 消息不会发送。

CDI 容器是否可以在内部处理这种情况,以便始终调用该事件?服务器自动启动时观察者会收到通知吗?如果不是,我该如何处理这种情况,以便我的方法万无一失?

NOTE:我已经在第二个服务中尝试了重试方法,直到消息可用。将事件保留在其他队列中也是一种替代方法,这看起来非常乏味。寻找一种聪明的方法。

UPDATE:我最初的代码是以这样的方式编写的:持久性和消息传递位于单个事务中。但这导致第二个服务在第一个服务持久化成功之前就消耗了消息,从而导致错误,因为第二个服务无法找到尚未持久化的所需数据。

更新2:初始方法伪代码如下:@TransactionAttribute(TransactionAttributeType.REQUIRED) public void processMessage() { // code to persist data to DB // code to publish JMS message to the consumer }

即使使用 xa-datasource 和 xa-connection 工厂,问题仍然存在。


一种方法是使用 XA 事务。

JMS和数据库资源都加入同一个事务,因此JMS消息在提交时被触发,数据库更新或JMS消息发送中的错误都会触发整个操作的回滚。

请注意,您必须更改使用的数据源定义xa-datasource,更新 JMS 连接工厂配置以使用 xa 并且 JMS 会话也必须进行事务处理

 <!-- JMS connection factory configuration -->
 <pooled-connection-factory name="myCxFactory">
     <transaction mode="xa"/>
     [...]
 </pooled-connection-factory>

// JMS session creation (message producer)
Session session = connection.createSession(true, Session.SESSION_TRANSACTED);

另请注意,只有消息生产才是交易的一部分,而不是他的消费

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CDI 事件观察器处理服务器崩溃和重新启动 的相关文章

随机推荐

  • UnicodeEncodeError: 'ascii' 编解码器无法对位置 0 处的字符 u'\xef' 进行编码:序数不在范围内 (128)

    我想解析我的 XML 文档 所以我存储了我的 XML 文档 如下所示 class XMLdocs db Expando id db IntegerProperty name db StringProperty content db Blob
  • 没有鉴别器列的 EclipseLink JPA 继承

    我有一个 Client 和 Affiliate 类 继承自 Person 类 正在使用联合继承策略类型 每个继承策略都与父类共享主键 由于没有鉴别器列 我们选择使用描述符定制器和类提取器 但它并没有真正给出任何它是如何工作的想法 而且代码似
  • 如何在 maven pom.xml 中定义属性并从命令行传递参数?

    我需要传递两个参数 比如说shell and version从命令行 问题是我无法理解如何定义这两个变量pom xml 然后在运行时获取我的 Java 代码中的参数 另外 当我将其作为 Maven 项目运行时 如何设置参数值 任何建议都会有
  • 某些 UTF-8 字符在浏览器上不显示

    某些 UTF 8 字符如 C2 96 连字符 的 UTF 8 等效字符 在浏览器上它显示为 带有 00 96 的 utf 框 而不是 连字符 这种行为有什么原因吗 我们该如何纠正这个问题 http stuffofinterest com m
  • 为什么 SQL Server 中的临时表没有从 tempdb 中删除?

    我创建了一个包含 7 个临时表的存储过程 每个临时表在其工作结束时都会被删除 我从一个 Web 服务调用 SP 并且我们在不同的实例中使用相同的 Web 服务 我已强制删除每个临时表 但是当 SP 执行时 它不会删除位于 tempdb 临时
  • 使用 Django auth UserAdmin 进行自定义用户模型

    来自Django Contrib Auth 文档 扩展 Django 的默认用户如果您对 Django 的 User 模型完全满意 并且只想添加一些额外的个人资料信息 您可以简单地子类化django contrib auth models
  • DataSnap XE2 和 TStream 方法参数

    我正在 Delphi XE2 中使用 TCP IP 协议开发 DataSnap 项目 该项目需要将二进制数据流作为方法参数传递到服务器 我遇到的问题是流内容似乎有大约 32 KB 的大小限制 超出此限制 服务器接收到的流为空 如果我传递其他
  • 使用经典 ASP 从 COM 对象检索字符串数组

    我有一个 NET 类 它包含通过访问器方法可用的简单字符串数组 如下所示 namespace Foo Bar ComVisible true Guid 642279A0 85D4 4c7a AEF5 A9FAA4BE85E5 public
  • hibernate.enable_lazy_load_no_trans 不起作用

    我正在使用 JPA2 1 和 hibernate 4 3 8 并且我已配置 persistence xml 以允许延迟加载 我已经添加了
  • 3D Touch 冻结我的应用程序

    也许我的问题等于 如果轻轻触摸 力触动画会冻结 iPhone 6s 中的 peek and pop 实施中应用程序冻结 1 无 bug 的强制触摸 一个UITransitionView创建图层是为了预览我的视图控制器 它工作完美 2 用 b
  • 一个函数在内存中只存储一次吗?

    当我们在对象或全局中的任何地方定义函数时 javascript函数是否会存储在内存中一次 function alert some value obj m function alert some value 如果您定义该函数一次 并将该函数的
  • Dataproc Hive 操作员未运行存储桶中存储的 hql 文件

    我正在尝试使用气流脚本运行云存储中存在的 hql 文件 我们可以通过两个参数将路径传递给 DataprocHiveOperator 查询 gs bucketpath filename q Error occuring cannot reco
  • 如何在Android 11中调整手机屏幕中的应用程序?

    在 Android 11 之前 我已经轻松地将我的应用调整为全屏 我的旧手机的摄像头孔和基本按钮位于屏幕区域之外 我的新手机的摄像头孔和基本按钮位于屏幕区域内 经过很少的设置 我的应用程序在旧手机上全屏显示 样式 xml
  • 用分号连接字符串数组

    这是一种经常出现在我们框架的一部分中的模式 给定一个字符串数组 我们必须将所有字符串连接起来 并用分号分隔 我想知道可以用哪种优雅的方式来完成 我在我们的代码库中看到了一些变化 而且当我必须这样做时 我总是必须再次重新考虑 我目前的模式是这
  • AVUrlAsset 和 WebVTT

    在 iOS TVOS 上 是否可以从 URL 加载远程 vtt 文件并将其用作字幕轨道 同时还从 URL 加载远程 HLS 视频 而不是在 m3u8 播放列表中指定的 VTT 伪代码 AVAsset video asset AVAsset
  • 如何在编辑表单中使用 DoctrineModule\Validator\NoObjectExists - Zend Framework 2 和 Doctrine 2

    最有效的使用方法是什么DoctrineModule Validator NoObjectExistsZend Form 中的验证器也用于编辑 因为当我使用相同的表单来保存编辑的值时 这会验证对象存在并标记表单无效 几周前 我在自定义过滤器中
  • 使用 ssl 加密创建 idhttpserver

    我还不擅长使用 delphi 但是根据一些示例 我已经成功创建了不超过 10 个用户的简单 http 服务器 有两个主要问题我还不知道如何解决 验证 管理用户的正确方法 会话 主要问题是 连接必须安全 所以需要SSL加密 如何实现 我发现的
  • Mac OSx 上的 OpenCL 内核错误

    我编写了一些 OpenCL 代码 该代码在 LINUX 上运行良好 但在 Mac OSX 上失败并出现错误 有人可以帮我确定为什么会发生这些情况吗 错误后显示内核代码 我的内核使用 double 所以我在顶部有相应的编译指示 但我不知道为什
  • 样条图平滑拐角

    我在我的项目中使用 NET 框架中的图表控件 我已将图表控件添加到表单中并进行配置 如下所示 Add a new series chart1 Series Add 1 var series chart1 Series 0 series Ch
  • CDI 事件观察器处理服务器崩溃和重新启动

    我正在尝试使用服务将一个项目持久保存在数据库中 并为后续服务触发 JMS 消息以获取持久保存的项目 以便它可以处理相同的项目 此特定操作发生在单个事务中 但由于有时存在竞争条件 第二个服务无法获取相应的项目 因为它尚未持久化 我的用例非常常