我正在观察一种不寻常的行为,我想了解发生了什么。
想象一下简单的设置。
首先,我有一个只返回一些东西的无状态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。
修改
顺便说一句,“重置”该方法的处理时间的唯一方法是重启服务器。
答案 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