我有一个 MDB,它使用队列中的消息,然后调用无状态 EJB 来执行一些数据库操作。像这样的东西:
public class TestMDB implements MessageListener
{
@EJB
private UpdateService updateSvc;
@Override
public void onMessage(Message message)
{
try
{
updateSvc.updateSystemStatuses();
}
catch(Exception e)
{
// log error
}
}
}
在上面的代码中,如果 updateSystemStatuses() 调用抛出 RuntimeException,这似乎会导致内存泄漏。我通过诱导 updateSystemStatuses() 抛出 RuntimeExceptions 来加速这个过程,当这种情况发生时,CPU 使用率和内存使用率峰值(如在 JVisualVM 中观察到的)直到我开始得到 OutOfMemoryErrors。
如果我修改代码以将 RuntimeExceptions 从 onMessage 中抛出,资源泄漏似乎完全消失了:
public class TestMDB implements MessageListener
{
@EJB
private UpdateService updateSvc;
@Override
public void onMessage(Message message)
{
try
{
updateSvc.updateSystemStatuses();
}
catch(RuntimeException e)
{
//log error
throw e;
}
catch(Exception e)
{
//log error
}
}
}
我知道从 EJB 方法中抛出 RuntimeException 会导致事务回滚,我认为这与我所看到的有关,但除此之外,我不清楚这里发生了什么。资源泄漏是 Glassfish 错误吗?我是否以正确的方式处理 MDB 中的异常?
我使用 Eclipselink 和 Oracle 11G 在 Java 1.6.0_35 上运行 Glassfish 3.1.2.2。