我正在使用Java Enterprise(3.1)和Glassfish。我有兩個通過JMS同步通信的獨立EAR。更具體地講:同步MDB通信,最大池大小問題
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.|#]
所以它看起來像容器沒有重用MDBs。相反,它創造了新的,直到我達到極限。我知道這是因爲EAR2中的MDB使用JMS發回結果。我的猜測是,仍然有一些資源在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) {
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類的東西符號等,但沒有工作或者嘗試。 ..)
塞巴斯蒂安
這很有趣。偶然,你是否在連接池的「泡泡」上?你分配了多少個連接?如果bean的數量顯着高於JDBC池,我們也會遇到類似的問題。基本上,這項工作沒有做的太快,以至於連接被及時釋放,以便其他MDB獲得他們的交易。我懷疑你有同樣的問題。因此,無論是加快處理時間,增加超時時間,還是使池變大。 – Preston 2011-05-10 20:19:44
我在想和你一樣,但是我已經設法將問題縮小到同步接收器。如果我用MDB替換同步接收器,我不再有問題。任何雖然如何解決這個問題?我仍然想使用同步調用。 – Sebastian 2011-05-12 08:59:06
你可以展示你現在的兩種變化嗎? – Preston 2011-05-12 14:23:46