繁体   English   中英

了解EJB事务类型

Understanding EJB transactions types

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我的应用程序中有一些我无法理解的行为。 我有1个有状态bean,1个无状态bean,我想从SFB的1个SLB方法(解析WEB页面)调用。 没关系,但是SLB调用将JMS消息发送到另一个应用程序的业务方法,并且由于事务类型(REQUIRED),所有消息都被同时接收。

所以我已将sendind方法的事务类型更改为REQUIRES_NEW,但它是相同的,所有消息都是同时收到的。

通过将解析方法更改为REQUIRES_NEW,我以异步方式接收消息。 那么如何解释这种行为呢?

总结一下:

SFB method -> REQUIRED

SLB method (parsing of WEB page, urls stored in String[]) -> REQUIRED

SLB method JMS -> REQUIRED

==> JMS messages are received synchronously



SFB method -> REQUIRED

SLB method -> REQUIRED

SLB method JMS -> REQUIRES_NEW

==> JMS messages are received synchronously



SFB method -> REQUIRED

SLB method -> REQUIRES_NEW

SLB method JMS -> REQUIRES_NEW

==> JMS messages are received asynchronously

我期望案例2异步发送JMS消息...

谢谢你的澄清

奥利维尔

2 个回复

您不显示您的代码,但我怀疑您从同一SLB实例的解析方法中调用SLB中的send方法。 在这种情况下,方法调用是直接方法调用,它不通过bean代理,因此完全忽略send方法上的事务注释。

你有

SFB -> transactional proxy -> SLB -> SLB

你应该在哪里

SFB -> transactional proxy -> SLB -> transactional proxy -> SLB

最简单的方法是将send方法放在单独的SLB中。

谢谢JB Nizet(没有快速回复,因为我必须等待8小时才能回复 - >我是StackOverflow的新手,需要声望)

我已经测试了使用新SLB发送JMS消息,结果相同但我的两个SLB是强耦合的,因为我将TopicPublisher和JMS消息传递给我的新测试EJB。

我刚测试在我的测试EJB中创建TopicPublisher和消息......它的工作!

这是我的新EJB:

package boursorama.stateless;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;


@Stateless
@LocalBean
public class Test {

    @Resource(mappedName="jms/boursoramaTopicFactory")
    TopicConnectionFactory topicConnectionFactory;

    @Resource(mappedName="jms/boursoramaTopicDestination")
    Topic topic;

    private TopicConnection _topicConnection;
    private TopicSession _topicSession;
    private TopicPublisher _topicPublisher;

    @PostConstruct
    public void postConstruct(){

        try {
            _topicConnection = topicConnectionFactory.createTopicConnection();
            _topicSession = _topicConnection.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
            _topicPublisher = _topicSession.createPublisher(topic);     
        } catch (JMSException e) {          
            e.printStackTrace();
        }       
    }

    @PreDestroy
    public void preDestroy(){
        try {
            _topicConnection.close();   
            _topicConnection = null;        
        } catch (JMSException e) {          
            e.printStackTrace();
        }    
    }

    public Test() {
        // TODO Auto-generated constructor stub
    }



    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void test(){
        try {
            Message m = _topicSession.createObjectMessage();                
            _topicPublisher.send(m);
        } catch (JMSException e) {          
            e.printStackTrace();
        }
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void test2(TopicPublisher to, Message m){
        try {
            to.send(m);
        } catch (JMSException e) {          
            e.printStackTrace();
        }
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void test3(Message m){
        try {
            _topicPublisher.send(m);
        } catch (JMSException e) {          
            e.printStackTrace();
        }
    }



}

当我调用test()或test3()时,我会异步接收所有消息,但test2()会一起发送消息。

如果我理解的话,当在方法之间共享某些资源(使用@Resource)时,我们无法在同一个EJB内部或在外部管理事务(使用REQUIRES_NEW)? 当然我有这种行为来尊重事务隔离?

再次感谢你

奥利维尔

1 EJB事务类型

我已经找到了关于此的文章,并且尚未找到一个足够好的文章。 有人可以向我解释交易类型的运作方式吗? (必需,RequiresNew,Mandatory,Never ......)以及这些如何影响具有不同类型的服务之间的服务调用? ...

2 了解EJB和Hibernate上下文中的事务

EJB默认情况下是处理事务管理的,而正如我所读到的,休眠也可以处理事务。 当我谈论事务时,我对回滚数据库持久性操作(如功能)有所了解。 我的问题是,如何同时使用EJB和Hibernate的应用程序有选择地选择一个事务提供程序来支持? EJB和休眠事务也可以同时工作吗? ...

3 了解EJB3 / JPA容器级事务和隔离级别

考虑一下我正在使用的一些代码的简化视图: 我已经在类级别将TransactionAttribute注释设置为MANDATORY 。 我理解这意味着必须在提供的事务中调用所有方法,如doSomething() 。 在这种情况下,我们使用容器管理的事务。 在SecondEjbTyp ...

4 EJB事务

我正在使用具有单个入口点(方法)的无状态EJB开发Web服务。 此方法包含3个步骤,我希望第1步在与第2步和第3步不同的事务中发生(应该在同一事务中)。 这些“步骤”包括对注入的无状态EJB的调用。 让我用一些代码解释一下: @Stateless @WebService(...) ...

5 没有事务的 EJB

我使用 EJB 是为了利用: 并发(我没有创建 2 个线程,而是将工作划分为 2 个 EJB bean)。 池化(我经常使用无状态 EJB,我喜欢池包含特定数量的 bean 的想法)。 这样,我就不怕内存不足了。 内存使用更可预测)。 异步处理(我只需要一个注释)。 好吧,问题是我 ...

2015-10-22 08:55:44 2 6793   ejb
6 异步EJB上的JTA事务

我正在考虑在我们的Java EE 6应用程序中使用EJB 3.1的异步功能。 我唯一关心的是如何管理JTA交易? 如果我将异步调用与EJB同步调用混合会怎样? 他们会在自己的TX上下文中加入同一个事务或异步事务吗? Thannks! ...

7 PersistenceContext和EJB事务边界

我正在努力解决以下问题: 我有一个无状态的bean作为实体的存储库,这个bean有一个声明的实体管理器。 当我从另一个无状态bean调用此bean时,将返回一个实体,然后,如果在此新返回的实体中调用一个关系,则会引发“ org.hibernate.LazyInitialization ...

9 调用POJO的EJB事务

假设我有一个实现必需的事务方法的会话Bean: 假设doTransaction()更改了非bean对象的内部状态,并且失败了。 回滚是否恢复非bean的原始状态? 如果没有,那么处理这种情况的推荐方法是什么? (或者是否不允许事务中进行POJO调用?) ...

10 EJB 3 + JMS和事务

我正在尝试在由tomee +(v 1.7)容器管理的EBJ中使用JMS(activemq v 5.10)。 我也想使用JMS事务,这就是我遇到的麻烦...这是我的EJB: 调用“ commit”时,此EJB导致一个非法状态异常: 如何在EJB中使用JMS“事务处理会话”? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM