【发布时间】:2014-04-04 21:11:36
【问题描述】:
我有一个无状态的 ejb,我与 jms 队列建立连接并向它发送消息。
我这样做的部分代码:
@Resource(mappedName = "jms/abcd")
private ConnectionFactory abcd;
@Resource(mappedName = "jms/xyz")
private Queue xyz;
@Override
public void saveCounter(String protocolName, String serialNumber, String counterName,CounterAction action)
{
Connection connection = null;
Session session=null;
try
{
connection = abcd.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(xyz);
Message message = session.createMessage();
message.setStringProperty("serialNumber", serialNumber);
producer.send(message);
}
catch (Exception e)
{
logger.error("Sending message to queue", e);
}
finally
{
try
{
if(session!=null){
session.close();
}
if (connection != null)
{
connection.close();
}
}
catch (JMSException e)
{
logger.warn(e);
}
}
}
我正在使用 MDB。消费代码如图:
@MessageDriven(name = "XXMessageDrivenBean", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType",
propertyValue = "javax.jms.Queue") }, mappedName = "jms/xyz")
public class CounterMessageDrivenBean {
...
@Override
public void onMessage(Message message){
System.out.println("got message: " + message);
log.debug("got message: " + message);
}
.....
}
我通过对这个 ejb 进行依赖注入并调用它的方法来使用来自其他 ejb 的这个 ejb 的功能。它适用于某些请求
但是当我尝试对我的代码进行负载测试时,在像数千次这样的请求之后,代码的 crateConnection 部分开始失败并出现异常:
Thread 64518 "httpWorkerThread-38080-1": (state = BLOCKED)
at com.sun.enterprise.resource.AbstractResourcePool.getResourceFromPool(AbstractResourcePool.java:788)
at com.sun.enterprise.resource.AbstractResourcePool.getUnenlistedResource(AbstractResourcePool.java:682)
at com.sun.enterprise.resource.AbstractResourcePool.internalGetResource(AbstractResourcePool.java:624)
at com.sun.enterprise.resource.AbstractResourcePool.getResource(AbstractResourcePool.java:470)
at com.sun.enterprise.resource.PoolManagerImpl.getResourceFromPool(PoolManagerImpl.java:248)
at com.sun.enterprise.resource.PoolManagerImpl.getResource(PoolManagerImpl.java:176)
at com.sun.enterprise.connectors.ConnectionManagerImpl.internalGetConnection(ConnectionManagerImpl.java:323)
at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:245)
at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:175)
at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:168)
at com.sun.messaging.jms.ra.ConnectionFactoryAdapter._allocateConnection(ConnectionFactoryAdapter.java:179)
at com.sun.messaging.jms.ra.ConnectionFactoryAdapter.createConnection(ConnectionFactoryAdapter.java:166)
at com.sun.messaging.jms.ra.ConnectionFactoryAdapter.createConnection(ConnectionFactoryAdapter.java:148)
在上面显示的代码中:saveCounter:createConnection
请帮助我理解为什么我的代码开始失败。 我是 glassfish 应用服务器。
提前致谢
【问题讨论】:
-
在对代码进行更多调试后,我发现在创建会话时内存不足。我认为生产者无法与经纪人建立联系。