如何在 JBoss 中配置 ActiveMQ JCA 连接器以使用 XA 连接?

2023-12-27

在 JBoss 5.1.0 上,我使用 *-ds.xml (标准 jboss DS)配置了数据源(PostgreSQL 8.3.11)。它使用 XADataSource (PGXA数据源 http://jdbc.postgresql.org/development/privateapi/org/postgresql/xa/PGXADataSource.html)。我还有 ActiveMQ 代理(现在它在 JBoss 下作为虚拟机内运行,但后者将在单独的服务器上运行)。

我想做的是让ActiveMQ连接工厂和数据源参与XA事务。例如,我想更新数据库记录并以 UOW 形式发送 JMS 消息。你明白了。

我在 my-pg-ds.xml 中配置了 PGXADataSource 并且它可以工作(我可以一路跟踪执行情况PGXAConnection的启动方法 http://jdbc.postgresql.org/development/privateapi/org/postgresql/xa/PGXAConnection.html#start%28javax.transaction.xa.Xid,%20int%29)。我尝试过配置ActiveMQXAConnectionFactory http://activemq.apache.org/maven/activemq-core/apidocs/org/apache/activemq/ActiveMQXAConnectionFactory.html直接在Spring中(我使用Spring 3.0.2.RELEASE),但这不起作用,因为在这种情况下Spring事务管理器(我使用注释让Spring配置Jta事务管理器 http://static.springsource.org/spring/docs/3.0.2.RELEASE/javadoc-api/org/springframework/transaction/jta/JtaTransactionManager.html它只是将所有工作委托给 Jboss 事务管理器)不会为给定的情况征用 XAResourceActiveMQXA连接 http://activemq.apache.org/maven/activemq-core/apidocs/org/apache/activemq/ActiveMQXAConnection.html。每当我尝试发送消息时,都会收到异常 JMSException,指出“会话的 XAResource 尚未在分布式事务中登记”。抛出自ActiveMQXA会话 https://svn.apache.org/repos/asf/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/ActiveMQXASession.java.

由于这不起作用,我已切换到 ActiveMQ ConnectionFactory 的 JCA 配置(基于this http://activemq.apache.org/integrating-apache-activemq-with-jboss.html文件)并且它适用于常规连接工厂 http://docs.oracle.com/javaee/5/api/javax/jms/ConnectionFactory.html,但我不明白如何配置它以使用 XAConnectionFactory。这好像是资源适配器 https://svn.apache.org/repos/asf/activemq/trunk/activemq-ra/根本没有 XA 连接工厂的正确 ManagedConnectionFactory、ManagedConnection 等实现。

我是否遗漏了某些内容,或者我别无选择,只能为资源适配器编写 XA 包装器?


好的,我找到了解决方案。 Jboss 包括适用于任何 JMS 工厂的 JCA 连接器(支持两种类型的事务:XA 和本地)。它位于/server//deploy/jms-ra.rar。这是我的配置方法。

First, activemq-jms-ds.xml文件进入 jms-ra.rar 旁边的部署目录:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE connection-factories
    PUBLIC "-//JBoss//DTD JBOSS JCA Config 1.5//EN"
    "http://www.jboss.org/j2ee/dtd/jboss-ds_1_5.dtd">

<connection-factories>
    <mbean code="org.jboss.jms.jndi.JMSProviderLoader"
       name="jboss.messaging:service=JMSProviderLoader,name=ActiveMQJMSProvider">
        <attribute name="ProviderName">ActiveMQJMSProvider</attribute>
        <attribute name="ProviderAdapterClass">org.jboss.jms.jndi.JNDIProviderAdapter</attribute>
        <attribute name="FactoryRef">java:/activemq/XAConnectionFactory</attribute>
        <attribute name="QueueFactoryRef">java:/activemq/XAConnectionFactory</attribute>
        <attribute name="TopicFactoryRef">java:/activemq/XAConnectionFactory</attribute>
    </mbean>

    <tx-connection-factory>
        <jndi-name>JmsXAConnectionFactory</jndi-name>
        <xa-transaction/>
        <rar-name>jms-ra.rar</rar-name>
        <connection-definition>org.jboss.resource.adapter.jms.JmsConnectionFactory</connection-definition>
        <config-property name="JmsProviderAdapterJNDI" type="java.lang.String">java:/ActiveMQJMSProvider</config-property>
    </tx-connection-factory>
</connection-factories>

这告诉 Jboss 查看 jms-ra.rar 并找到可以提供托管连接工厂的适配器org.jboss.resource.adapter.jms.JmsConnectionFactory。内部jms适配器依赖于JmsProviderAdapter,它用于存储连接工厂的JNDI名称(在我的配置中所有名称都是相同的)。

我使用 mbean 标签来配置 JMSProviderLoader (这是从内部 JBoss 配置之一复制的)。现在,我所要做的就是以某种方式创建 XA 连接工厂的实例并将其绑定到java:/activemq/XAConnectionFactory。有多种方法可以做到这一点(例如,实现 MBean 包装器)。

由于我是 Jboss 5,所以我使用了微容器(这可能在 Jboss 6 中工作)。我添加了activemq-jms-jboss-beans.xml文件到deployers目录:

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="urn:jboss:bean-deployer:2.0">
    <!-- Define a Jndi binding aspect/annotation that exposes beans via jndi
        when they are registered with the kernel.
    -->
    <aop:lifecycle-configure xmlns:aop="urn:jboss:aop-beans:1.0"
        name="DependencyAdvice"
        class="org.jboss.aop.microcontainer.aspects.jndi.JndiLifecycleCallback"
        classes="@org.jboss.aop.microcontainer.aspects.jndi.JndiBinding"
        manager-bean="AspectManager"
        manager-property="aspectManager">
    </aop:lifecycle-configure>

    <bean name="ActiveMQXAConnectionFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory">
        <annotation>@org.jboss.aop.microcontainer.aspects.jndi.JndiBinding(name="activemq/XAConnectionFactory", aliases={"java:/activemq/XAConnectionFactory"})</annotation>
        <property name="brokerURL">vm://localhost</property>
    </bean>
</deployment>

我创建一个ActiveMQXAConnectionFactory豆。为了将其绑定到 JNDI,我使用 JndiBinding 注释对其进行注释。为了使这个注释起作用,我们需要 JndiLifecycleCallback。据我所知,JndiLifecycleCallback 会在微容器创建的每个 bean 上调用,并检查该 bean 上的 JndiBinding 注释。

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

如何在 JBoss 中配置 ActiveMQ JCA 连接器以使用 XA 连接? 的相关文章

随机推荐

  • 如何在反序列化“设置”对象时更新 WPF UI

    我的目标是这样做 用户选择设置文件 读取设置并相应更新 UI 显然 节省也应该是可能的 我的程序当前不是 WPF XAML 现在执行此操作意味着在需要新设置时需要进行大量重复和添加工作 所以有人告诉我 WPF XAML 是正确的选择 我研究
  • 在 C++ 中实现“有限通用性”

    我正在将一个项目从 Java 转移到 C 但我在 Java 中相对简单的东西上遇到了问题 我有课X它是为了处理类型的对象而设计的Y以及继承自的对象Y X经常需要调用方法Y say kewl method 并且这个方法在继承自的每个类中都是不
  • SQLite数据库-选择两个日期之间的数据?

    我想按日期选择数据 从一个日期到另一个日期 所以我有这个查询 SELECT FROM mytalbe WHERE date BETWEEN 2014 10 09 AND 2014 10 10 但这个查询只返回数据 2014 10 09 排除
  • 为什么 rownames(installed.packages()) 有一个名称属性?

    我有以下功能供个人使用 它需要输入作者的名字来查看我的机器上是否有他们的任何软件包 authoredPackages lt function author s lt sapply rownames installed packages pa
  • 为学说集合中的每个实体构建一个具有复选框的表单

    我正在显示一个经过过滤的实体集合的 html 表 并且我想在每行中显示一个复选框作为表单的一部分 该表单会将所选实体添加到会话变量中 我认为每个复选框都应该将实体 id 作为其值 并且我将从表单字段数据中获取 id 数组 好吧 所以该值应该
  • 如何获取 PostgreSQL 中聚合的定义/源代码?

    我发现这个相关答案很有用 从 PostgreSQL 导出 创建聚合 函数 https stackoverflow com questions 15112971 export create aggregate functions from p
  • 始终以基本形式处理 PreviewKeyDown 事件

    我们需要在基本表单中处理此事件 无论当前哪些控件具有焦点 我们有几个全局关键命令 无论控制焦点如何 它们都需要工作 这是通过正常处理表单中的 PreviewKeyDown 事件来实现的 当我们将用户控件添加到表单时 该事件不再触发 我在这里
  • 在 repl.it 上运行discord.py bot时如何解决“429:太多请求”?

    我的代码 见下文 运行良好 但随后弹出此错误并且不会消失 http py line 293 in static login data await self request Route GET users me File opt virtua
  • 通过ajax将当前页面html发送回服务器

    在我的应用程序中 我通过 jquery ajax 将网页的 html 发送回服务器 因为我需要在服务器中存储此页面的副本 代码如下 document ready function var pcontent document body inn
  • 如何使用自定义文档根在 Apache 2.4 中显示目录索引

    我在 Ubuntu 13 10 中的 Apache 2 4 中遇到问题 我尝试将文档根目录更改为 home fandi public html 一切工作正常 但我尝试在 public html 中创建文件夹 但收到如下错误 Sat Jan
  • 这个 Coldfusion 查询 SQL 注入证明吗?

    通常 我在应用程序中使用整数 id 但对于这个开发 我正在文本字段 标签名称 上进行查找 我确实使用了 cfqueryparam 但考虑到它是一个文本字段 它是否容易受到 SQL 注入攻击 如果是这样 除了繁琐地搜索 SQL 命令的字符串之
  • 我可以使用layout_weight来定位RelativeLayout吗?

    我一整天都在努力让它发挥作用 我想我可以使用RelativeLayout android layout weight 0 3 将三个按钮放置在屏幕右侧 不居中 而是距顶部向下 30 这可能吗 如果可以我该怎么做 以下是我的 XML 其中显示
  • 允许的内存大小 php.ini

    我有一个 Symfony 4 应用程序 我上传文件有 2MB 限制 这个限制有效 在开发环境中一切正常 图像上传得很好 但在产品中 我总是收到相同的消息 Fatal error Allowed memory size of 13421772
  • 泛型函数类型中的通用量化

    正在阅读paper http lucacardelli name Papers OnUnderstanding A4 pdf关于编程语言中的类型和多态性 我想知道是否可以用 Scala 表达类型成员上类似的通用量化 论文中的示例 type
  • 如何使用 Postgres 和 Tomcat7 JDBC Pool 配置PreparedStatement 缓存?

    我将 Tomcat7 与 Postgres 9 1 结合使用 将 JPA 与 Hibernate 结合使用 并且我想配置准备好的语句池 我通过查看 postgres 查询日志看到的正常默认行为是看到许多 PARSE BIND 对同一查询执行
  • 在 NanoHTTPD 中检索 HTTP 正文

    如何检索 HTTPPOST实施时请求主体纳米HTTPD http nanohttpd coms serve method 我尝试过使用getInputStream 的方法IHTTPSession已经 但我总是得到一个SocketTimeou
  • 如何模拟cmd-shift-4截屏界面?

    我正在构建一个 OSX 应用程序 并希望使用与 cmd shift 4 UX IE 启动操作类似的界面来捕获屏幕的一部分 呈现一个鼠标光标 mouseDown 并拖动 mouseUp 捕获屏幕坐标 同时绘制半透明覆盖层以表示正在捕获的区域
  • 每 n 个添加类

    我有一个元素列表 我想用 3 种不同的方式设置它们的样式 我希望每个第三个列表项在整个列表中都具有相同的类 例如 li class A Some Content li li class B Some Content li li class
  • 具有特定范围的 angularjs 部分模板

    我想在主模板中包含一个部分模板 但在调用部分模板时具有特定的范围 例如 这是我的主模板 非常简化 实际模板更复杂 所以这里不能使用 ng iterate h1 title my item1 name is item1 name h1 div
  • 如何在 JBoss 中配置 ActiveMQ JCA 连接器以使用 XA 连接?

    在 JBoss 5 1 0 上 我使用 ds xml 标准 jboss DS 配置了数据源 PostgreSQL 8 3 11 它使用 XADataSource PGXA数据源 http jdbc postgresql org develo