Search code examples
jakarta-eejmswebsphere

Why is SIB connection closed? (Websphere Service Integration Bus)


I have a Message Driven Bean (MDB) deployed on WebSphere 7.0.0.21 which sends JMS messages on a SIB (Service Integration bus) queue.

The JMS resources are created:

@Resource(name = CONN_FACTORY, mappedName = CONN_FACTORY)
private QueueConnectionFactory connFactory;

@PostConstruct
public void postConstruct() {
  queueConnection = connFactory.createQueueConnection();
  queueSession = queueConnection.createQueueSession(true, Session.AUTO_ACKNOWLEDGE);
  responseQueueSender = queueSession.createSender(getResponseQueue());
}

And destroyed:

@PreDestroy
public void preDestroy() {
  responseQueueSender.close();
  queueSession.close();
  queueConnection.close();
}

Sending like this:

TextMessage responseMessage = queueSession.createTextMessage("message");
responseQueueSender.send(responseMessage, DeliveryMode.PERSISTENT, Message.DEFAULT_PRIORITY, expirationTime);
queueSession.commit();

I have about 20 instances of my MDB. When I generate a lot of incoming messages to the MDB, problems arise. I got the following error:

CWSIA0053E: An exception was received during the call to the method JmsSessionImpl.getTransaction (#1): javax.resource.spi.IllegalStateException: CWSJR1121E: An internal error has occurred. During the call to the method getManagedConnection the exception javax.resource.spi.ResourceAllocationException: CWSJR1028E: An internal error has occurred. The exception com.ibm.ws.sib.processor.exceptions.SIMPConnectionUnavailableException: CWSIK0022E: The connection is closed to messaging engine seit3022Node01.server1-Payment and cannot be used. was received in method createManagedConnection. was thrown..

If I increase the Queue connection factory's connection pool size a lot, the error occurs more seldom but it still exists. If I lower the pool size the error occurs very often.

How can the connection be closed? If I have a connection pool size greater than the number of concurrent MDB:s, how can a connection be closed?

There are various properties of the connection pool, but I can't find any regarding closing connections in use... And my code definitely does not close any connection (except in @PreDestroy)


Solution

  • I'm not sure what causes the SIMPConnectionUnavailableException here, but the way you manage the connection in your MDB is not correct anyway. You should move the code in the postConstruct and preDestroy methods to onMessage method and not attempt to reuse the same connection. This is especially important if you want to ensure that the MDB has correct transactional behavior. Note that since the connection factory does connection pooling, requesting a connection per received message doesn't cause overhead.