每次调用后,EJB方法都需要更多的时间来返回

时间:2014-06-16 13:53:18

标签: java java-ee jboss ejb jboss7.x

我正在观察一种不寻常的行为,我想了解发生了什么。

想象一下简单的设置。

首先,我有一个只返回一些东西的无状态bean:

@Stateless
public class SimpleService{
    private Map<String, String> map;

    @PostConstruct
    public init(){
        map = new HashMap<>();
    }

    public Map<String,String> getMap(){
        return map;
    }
}

然后我有另一个无状态bean进行一些处理

@Stateless
public class ProcessService{

    private static final Logger log = LoggerFactory.getLogger(ProcessService.class);
    private static final int MAX = 2000;

    @Inject
    private SimpleService simpleService;

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void process(){
        final long start = System.currentTimeMillis();
        for(int i=0; i<MAX; i++){
            simpleService.getMap();
        }
        final long end = System.currentTimeMillis();
        log.info(MessageFormat.format("Process took {0} ms", end - start));
    }
}

然后我有一个简单的CDI bean来调用流程方法。

结果:

当我连续多次调用process方法时,处理时间不断增加:

Process took 900 ms
Process took 1,100 ms
Process took 1,200 ms
Process took 1,400 ms

每次调用该方法时它都会继续上升。

如何解释?

我正在使用Java JDK 1.7.0_25和JBOSS EAP 6.1。

修改

顺便说一句,“重置”该方法的处理时间的唯一方法是重启服务器。

2 个答案:

答案 0 :(得分:4)

我已经使用WildFly 8.1.0.Final进行了测试,我得到以下内容:

Process took 900 ms
Process took 600 ms
Process took 400 ms
Process took 300 ms
Process took 130ms
Process took 100ms

然后它稳定在90ms左右。

所以我认为我们可以放心地假设原始问题是JBoss AS 7中的一个错误,它已在WildFly 8.1中得到修复。他们甚至引入了一些优化,而不仅仅是固定的!

修改<!/强>

我为每个人道歉,我做了错误的诊断。这个错误与JBoss的版本没有任何关系,但由JRebel提供。

当我下载Wildfly时,我没有在附带JRebel代理的调试模式下运行它(我一直在使用EAP 6.1)。如果我在没有JRebel的情况下启动JBoss EAP 6.1,问题就不会发生。

我已经习惯了JRebel我忘记了它已经开启了!

我将向JRebel团队提出一个问题。

编辑2

JRebel团队调查并能够重现缺陷。它已在夜间版本中修复,并将在下一版本(2014年8月/ 9月到期)中修复

答案 1 :(得分:0)

你可以尝试相同的测试,但是创建一个接口SimpleService,当前的SimpleService将类似于SimpleServiceImpl,它将实现SimpleService。
我认为cdi可以用来包装EJB。 嗯..或其他事情可能是尝试使用@EJB注入而不是@Inject