2011-08-05 18 views
0

我有一个在队列上侦听的MDB。每当它收到一条消息时,它都会将执行转发给一个无状态会话bean,这个会话bean有很多逻辑,更新等等。这里是逻辑/调用链的流程。MDB事务不会在超时时回滚电子邮件

queue-> mdb->会话bean->会话bean->的电子邮件 - >记录

最终的结果是一个电子邮件和随后的记录。

默认情况下,MDB事务由容器管理,超时时间为30秒。

但是,每当到达超时,则会引发超时异常和重试消息,但嵌套事务和流程均不会回退(从会话bean)。因此,由于重试导致多个电子邮件消失,但是所有日志记录都从会话bean回滚(除了从MDB自身记录的内容)

不应该从MDB回滚(包括mdb)中调用所有事务日志记录,特别是电子邮件?

会话bean的默认交易类型都是'required'。

我也明确设置TransactionManagement中类型与TRANSACTIONTYPE作为必需的容器。电子邮件仍然会出去。从会话bean回滚记录但发生重试。

然后,我将TransactionType设置为REQUIRES_NEW。电子邮件仍然会出去。从会话bean回滚记录但重试DOESNT发生。

什么设置做我把确保由MDB,并从它调用的任何交易开始整个事务,得到回滚和重试发生?

我不想使用bean管理的事务,因为我想重试失败发生。

我的应用程序服务器是带有ejb 3规范的weblogic 10.3。

回答

0

您的邮箱资源不是事务性的,所以沟MDB超时,有你的电子邮件发件人依靠电子邮件传输超时,此时,只调用TX setrollback。该tx将回滚,该消息将被重新发送,并且您的电子邮件地址可能只有在成功重试时才会发送。电子邮件传输超时的结果可能不是确定性的。

+0

我不明白你说什么。我的问题是,无论是MDB超时还是发送电子邮件后引发的任何其他异常,事务性更新(如登录到数据库表)都会回滚,但电子邮件仍然会消失。在这种情况下邮件传输的设置超时如何防止电子邮件外泄? – Jaizen

+0

在交通工具上设置超时可让您最有可能将您的数据库和*实际*电子邮件同步发送。让MDB超时对电子邮件发送没有影响,所以请将其消除。当您在运输工具上发生超时时,电子邮件*可能*没有将其发送出去,因此回滚TX。如果您通过电子邮件传输获得握手,那么电子邮件绝对会使其与SMTP服务器一样远,因此提交TX。一旦你打电话给电子邮件发送,几乎没有确定的方法来确定它是否确实实现了它(当发生异常时)。 – Nicholas

+0

尼古拉斯,你是对的。据我所知,没有办法通过JavaMail API方法阻止邮件成功发送后外出。我认为有一些方法可以通过XA资源管理器处理这个问题,这样一旦发生提交就可以发送邮件,但是没有运气。谢谢。 – Jaizen