Я использую Java Enterprise (3.1) с Glassfish.У меня есть два отдельных EAR, которые общаются синхронно через JMS.Более конкретно:
EAR1 использует обмен сообщениями JMS, чтобы сообщить EAR2, что делать.EAR1 начинает прослушивать ответ от EAR2 (QueueReceiver.receive).EAR2 получает сообщение и, соответственно, выполняет некоторую обработку, а затем отправляет сообщение JMS обратно в EAR1 с выводом.
Все это работает нормально.Пока я не получу это исключение:
[#|2011-05-10T15:05:27.382+0200|WARNING|glassfish3.1|javax.enterprise.resource.resourceadapter.com.sun.enterprise.connectors|_ThreadID=90;_ThreadName=Thread-1;|RAR5117 : Failed to obtain/create connection from connection pool [ jms/QueueConnectionFactory ]. Reason : com.sun.appserv.connectors.internal.api.PoolingException: In-use connections equal max-pool-size and expired max-wait-time. Cannot allocate more connections.|#]
Так что похоже, что контейнер не использует MDB.Вместо этого он создает новые, пока я не достигну предела.Я знаю, что причина этого в том, что MDB в EAR2 используют JMS для отправки результатов.Я предполагаю, что в экземпляре MDB все еще есть некоторые ресурсы, которые вызывают поведение.
Если я просто использую MDB для распечатки полученного сообщения, я могу продолжать отправлять сообщения весь день, так что это определенносвязан с соединением JMS.
Я занимаюсь этим уже два дня, поэтому, если кто-то захочет предложить какую-либо помощь, это будет с благодарностью.
этот код работает весь день:
package xxx;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;
@MessageDriven(activationConfig = {
@ActivationConfigProperty(
propertyName="destinationType",
propertyValue="javax.jms.Queue")
}, mappedName = "AssociationQueue1")
public class AssociationMDB implements MessageListener {
@Override
public void onMessage(Message arg0) {
MapMessage msg = (MapMessage)arg0;
String source = null;
String target = null;
try {
source = msg.getString("source");
target = msg.getString("target");
} catch (JMSException e) {
e.printStackTrace();
}
System.out.println(source + " " + target);
}
}
Пока этого нет:
package xxx;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;
@MessageDriven(activationConfig = {
@ActivationConfigProperty(
propertyName="destinationType",
propertyValue="javax.jms.Queue")
}, mappedName = "AssociationQueue1")
public class AssociationMDB implements MessageListener {
@Override
public void onMessage(Message arg0) {
Logger logger = Logger.getLogger(this.getClass().getSimpleName());
QueueConnection qConnect = null;
QueueSession qSession = null;
QueueSender qSender = null;
try {
InitialContext context = new InitialContext();
Queue responseQ = (Queue)context.lookup("AssociationQueue2");
QueueConnectionFactory factory = (QueueConnectionFactory) context.lookup("jms/QueueConnectionFactory");
qConnect = factory.createQueueConnection();
qSession = qConnect.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
qConnect.start();
qSender = qSession.createSender(responseQ);
TextMessage answer = qSession.createTextMessage();
answer.setText("hey");
qSender.send(answer);
logger.info("message sent");
}
catch (JMSException jmse) {
jmse.printStackTrace();
} catch (NamingException e) {
e.printStackTrace();
}
finally {
try {
if(qSender != null) {
qSender.close();
logger.info("cleaning qSender");
}
if(qSession != null) {
qSession.close();
logger.info("cleaning qSession");
}
if(qConnect != null) {
qConnect.close();
logger.info("cleaning qConnect");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
(я также пытался использовать более новые, более причудливые вещи EJB, такие как нотации и т. Д., Но тоже не работал ...)
Себастьян