JMS connection to createConnection queue fails after some requests

I have an unmatched ejb, and in this I make a connection to the jms queue and send a message to it.
Part of the code where I do this:

@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);
            }
        }

    }

I am using MDB. The user code looks like this:

 @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);

     }

     .....
 }

I use the functionality of this ejb from other ejbs by injecting the dependencies of this ejb and calling its method. It works great for some queries

But when I try to perform a load test of my code, after a certain number of requests, such as a thousand, part of the crateConnection code starts to fail with the exception:

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)

code above: saveCounter: createConnection

Please help me understand why my code is starting to fail. I am an application server for glass fish.

Thanks in advance

+4
4

, . , .

, , , jms, 1 . , jms .

0

Himanshu,

, , - , ejb, MDB.

- JMS-.

MDB, JMS MDB. , JMS-, . , , .

+1

, MessageProducer. , . MessageProducer javadoc close(). producer.close(); producer.send(message);.

, - session.close() , . try/catch:

 finally
    {
        try
        {
            if(session!=null){
               try {
                  session.close();    
                } catch(JMSException e) { }
            }
            if (connection != null)
            {
                connection.close();
            }
        }
        catch (JMSException e)
        {
            logger.warn(e);
        }
    }

, !

+1

I use very similar code to process 200,000-300,000 trks every day and do not encounter any problem. Here I use the code: ...

Connection connection;
Session session = null;
MessageProducer messageProducer;
try {
    connection = connectionFactory.createConnection();

    session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    messageProducer = session.createProducer(queue);
    TextMessage message = session.createTextMessage();

    for (String msgKey : messages.keySet()) {

        message.setText(messages.get(msgKey));
        // logger.debug("Sending message to Queue: "
        // + message.getText());
        messageProducer.send(message);
    }
} catch (JMSException e) {
    logger.info("Error " + e);
    e.printStackTrace();
}

...

The only difference I see from your code is that I declare MessageProducer outside the try block. Try to understand does not matter.

+1
source

Source: https://habr.com/ru/post/1529852/


All Articles