当 JMS Prod 位于辅助 POJO 类中时,如何在事务中包含 JMS Producer

2024-06-02

简短的问题:有没有办法强制无状态 EJB 调用的 POJO 存在于 EJB 的上下文中,以便事务和资源注入可以在 POJO 中工作?

具体来说,在我想要做的事情的上下文中:如何在 EJB 的事务中包含 POJO JMS 生产者,该生产者在调用 POJO 发送消息之前将一些数据保存在数据库中,这样如果消息不能由于异常发送,数据库事务也会回滚吗?我想异步发送邮件。

这是一条幸福的道路(从无状态会话 bean 开始):

  • 将数据保存到数据库 // 这有效
  • 从持久化的数据中提取选择数据并将其放入 自定义“消息”类(实际上是 dto)
  • 调用 EmailQueueMessenger POJO 的 sendEmail 方法,向其传递消息对象。
  • 消息被发送到 MDB 来处理并发送电子邮件(不是问题的一部分,只是为了完整性而放在这里)

下面的代码有效,如果我在上下文查找中强制发生错误,它不会回滚调用类中的数据库“持久化”。顺便说一句,我也无法让 @Resource 注入工作。

//In the EJB
EmailQueueMessenger eqm = new EmailQueueMessenger();
eqm.sendEmail(messageObject);
// mailObject will be translated into an email message at the other end of the queue.  

/******************** POJO Below ************/  

public class EmailQueueMessenger implements Serializable {

    // Resource injection doesn't work... using 'lookup' below, which does work.
    //    @Resource(name = "jms/EmailerQueueConnectionFactory")
    //    private ConnectionFactory connectionFactory;
    //    @Resource(name = "jms/EmailerQueue")
    //    private Destination EmailerQueue;

        public EmailQueueMessenger() {
        }

        public void sendEmail(MailMessageDTO theMessage) {

            Context ctx = null;
            try {
                ctx = new InitialContext();
                ConnectionFactory connectionFactory = (ConnectionFactory) ctx.lookup("jms/EmailerQueueConnectionFactory");
                System.out.println("JMS Producer CTX Name In Namespace: " + ctx.getNameInNamespace());
                //Destination EmailerQueue = (Destination) ctx.lookup("jms/ERROR"); // forces exception
                Destination EmailerQueue = (Destination) ctx.lookup("jms/EmailerQueue");  // normal working code

                try {
                    Connection con = connectionFactory.createConnection();
                    Session session = con.createSession(false,
                            Session.AUTO_ACKNOWLEDGE);
                    MessageProducer msgProd = session.createProducer(EmailerQueue);

              ...

我尝试添加:

@TransactionAttribute(TransactionAttributeType.MANDATORY)
@Stateless

POJO 定义,但没有什么区别。

FWIW 我正在为 EmailQueueMessenger 使用单独的类,因为应用程序的其他部分需要偶尔发送电子邮件,因此不想重复代码。


应该提到的是,我做了一个测试,将所有 JMS 内容移至第一个 EJB 中,并且它运行正确......但我需要它在一个单独的类中工作,以供应用程序的其他部分使用。


我认为你有两个问题:

  1. 你需要让你的 pojo 成为 SLSB。它应该被注入到您的 jms 侦听器中,而不是直接调用,以便您处理代理引用。它仍然可以作为简单的 pojo 重用,因为如果未部署在容器中,注释将被忽略。

  2. 您正在使用 AUTO_ACKNOWLEDGE 创建 jms 会话,但需要对其进行事务处理。此外,请确保 jms 连接来自事务性 JCA 源,因为这会将会话与事务关联起来。

=========更新=========

嘿比尔;

抱歉,出于某种原因,我认为外部 bean 是 JMS 侦听器......无论如何,问题是相同的。

如果你想电子邮件队列信使要按照您在其上放置的注释(事务、注入等)进行操作,您必须将其作为 EJB 引用,而不是作为简单的 pojo。因此,您的外部会话 bean 应该如下所示:

@EJB   // key difference
private EmailQueueMessenger eqm;

@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void sendMessage(Object messageObject) {
   eqm.sendEmail(messageObject);
}

现在你的

@Resource(name = "jms/EmailerQueueConnectionFactory")
@Resource(name = "jms/EmailerQueue")

and

@TransactionAttribute(TransactionAttributeType.MANDATORY)
@Stateless

注释将受到尊重。

最后,您的 JMS 发送方将在调用时注册事务,并且您需要确保事务管理器知道您正在事务中登记第二个资源管理器(首先是 DB,现在是 JMS)。我对 glassfish 不太熟悉,但似乎有一个带有开关的配置屏幕,允许您指定连接工厂的事务支持级别 https://stackoverflow.com/questions/4186738/glassfish-jta-does-not-affect-jms-resource-rollback-but-message-sent.

我会将发件人代码更改为:

Session session = con.createSession(true, Session.SESSION_TRANSACTED);

从技术上讲,您可以将 JMS 连接实例缓存在 EmailQueueMessenger 实例中。您的代码不应关闭 JMS 会话,因为这将在事务完成时进行处理(尽管我已经看到了 JMS/JTA 实现之间在这一点上的差异)。

我希望这能澄清一切,我really希望它有效!

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

当 JMS Prod 位于辅助 POJO 类中时,如何在事务中包含 JMS Producer 的相关文章

随机推荐

  • 单元测试验证失败

    我正在运行我的单元测试PostMyModel路线 然而 在PostMyModel 我用的是线Validate
  • CSS 和 XPath 选择器有什么区别?就跨浏览器测试的性能而言,哪个更好?

    我正在与硒网络驱动程序 https en wikipedia org wiki Selenium software Selenium WebDriver2 25 0 在多语言 Web 应用程序上 主要测试页面内容 针对不同语言 如阿拉伯语
  • 该项目可能使用的 Gradle 版本不包含“compileSdkVersion()”方法

    当我尝试运行最初在 Eclipse ADT 上创建的项目时 我遇到了这个问题 Error 17 0 Gradle DSL method not found compileSdkVersion Possible causes ul li Th
  • Docker 运行与创建

    有什么区别docker run and docker create命令 我通常使用run但有时在文档中我看到create 码头工人的 help tells create Create a new container run Run a co
  • 无需重定向的 HTML 页面提交

    有没有什么方法可以在不使用ajax的情况下提交html表单而无需从当前页面重定向 你可以设置一个target 为您form 这样您就可以将表单提交到新选项卡 target blank 或一个小的 隐藏的iframe target nameo
  • OpenCV 2.4.3rc 和 CUDA 4.2:“OpenCV 错误:没有 GPU 支持”

    我在这张专辑中上传了几张截图 https i stack imgur com TELST jpg https i stack imgur com TELST jpg 我正在尝试在 Visual Studio 2008 中的 OpenCV 中
  • detectorClassPathResourcesToStage - 无法转换 url

    当我在 GCE 中运行 jar 时 出现以下错误 java jar mySimple jar project myProjcet Aug 13 2015 1 22 26 AM com google cloud dataflow sdk ru
  • 带有node-gyp的node.js应用程序无法在azure网站上部署

    我已经建立了一个 Azure 网站 并且正在尝试使用依赖于 node gyp 的示例应用程序 我得到这个 emote gt email protected cdn cgi l email protection install C DWASF
  • MVC 3 Razor _ViewStart 中的公共变量

    我正在 MVC 3 附带的新 Razor 引擎上构建一个网站 并且喜欢新语法 但是 我对使用公共属性 常量感到不知所措 我知道使用 WebForms 我们可以在代码后面添加公共属性 public string ImageFolder get
  • R 中 optim() 的优化(L-BFGS-B 需要“fn”的有限值)

    我在 R 中使用 optim 来求解涉及积分的可能性时遇到一些问题 我收到一条错误消息 optim par c 0 1 0 1 LLL method L BFGS B lower c 0 L BFGS B 需要 fn 的有限值 中的错误 下
  • 尝试使用 Mongoose 进行批量更新插入。最干净的方法是什么?

    我有一个集合 其中包含包含三个字段的文档 名字 姓氏和年龄 我试图找出 Mongoose 中的哪个查询可以用来进行批量更新插入 我的应用程序偶尔会收到具有相同三个字段的新对象数组 我希望查询检查文档中是否已存在名字和姓氏 如果存在 则更新年
  • WPF - 全局样式?

    有没有办法为我的 WPF 应用程序设置全局样式 我希望做的是将样式应用于所有也有图像子项的按钮 嗯 有点 这是您可以做的一种包罗万象的方法 将以下元素放入您的 App xaml 中 所有按钮都会发生变化 除了您手动应用样式的按钮 但是 如果
  • 需要正则表达式帮助

    我正在尝试替换两次或多次出现的 br like br br br 标签与两个一起 br br 具有以下模式 Pattern brTagPattern Pattern compile lt s br s s gt s 2 Pattern CA
  • php 包含打印 1

    我编写了以下代码 当我将 include 函数与旨在输出到页面的函数 例如 或 echo include foo php 结合使用时 它会返回包含内容 但在已包含的内容后面带有 1 echo include foo php 应该 inclu
  • 为什么“script”命令会生成 ^[ 和 ^M 字符以及如何使用 vim 搜索和替换删除它们?

    在linux上 使用bash shell 当我使用script命令时 生成的文件称为typescript 当我用 vim 打开该文件时 每一行都包含 M字符 并且有几行 由于我的彩色命令提示符 包含一个字符 我想用任何东西替换这些字符 从而
  • Delphi 2010 控制闪烁

    我一直在从 XP 操作系统升级或迁移我们的软件 以便能够在 Windows 7 下编译和运行 我们的软件开始出现我们在 Windows XP 下没有注意到的问题 目前 我正在处理 TForm 上闪烁的用户定义控件 它似乎时不时地闪烁 但并非
  • 从 PHP 启动守护进程

    对于网站 我需要能够启动和停止守护进程 我目前正在做的是 exec sudo etc init d daemonToStart start 守护进程已启动 但 Apache PHP 挂起 做一个ps aux透露sudo它本身变成了僵尸进程
  • 如何在 React Native 中使用 Platform.OS 来处理元素?

    我想在 IOS 上只使用 KeyboardAwareScrollView 而不使用任何功能 并给出下面的 android 代码 我知道我需要使用 Platform OS ios 但我不明白如何实现它 请帮我 render return
  • 以编程方式添加带有自动布局的 UISLider

    我正在尝试以编程方式将 UISlider 添加到我的视图中 包括约束 以便其宽度适应整个屏幕宽度 这是我到目前为止得到的 2 Add UISlider self slider UISlider alloc init self view ad
  • 当 JMS Prod 位于辅助 POJO 类中时,如何在事务中包含 JMS Producer

    简短的问题 有没有办法强制无状态 EJB 调用的 POJO 存在于 EJB 的上下文中 以便事务和资源注入可以在 POJO 中工作 具体来说 在我想要做的事情的上下文中 如何在 EJB 的事务中包含 POJO JMS 生产者 该生产者在调用