You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@activemq.apache.org by paoletto <pa...@gmail.com> on 2008/04/09 12:17:43 UTC

Sending message from EJB3: poor performances after a while

i wrote the following Stateless Session Bean, and ran in a j2ee application
on jbossAS.

With the following implementation i have the problem that, if for example i
put the send in a for
to send 1000 messages (invocations) in a row, after about 200-250 the sender
start to slow down and at
about 300th message, it start to take 3-4 minute to send 1 single message.
then i have to stop the AS,
cause JVM goes to 100% load and the for cycle does not end.

i dont know what i did wrong here..
But what i can say is that if every time i also create a new
ActiveMQConnectionFactory, everything
slowes down quite much, but it does not suffer from the problem before (that
means, poor but constant performances)

any clue? 






@Stateless
public class JmsFrontendBean  implements JmsFrontendRemote,JmsFrontendLocal
{
  	public static final String RemoteJNDIName = 
JmsFrontendBean.class.getSimpleName() + "/remote";
	public static final String LocalJNDIName = 
JmsFrontendBean.class.getSimpleName() + "/local";
 
//	private Context ctx = null;
	ActiveMQConnectionFactory connectionFactory = null;
 
	@PostConstruct
	private void postConstruct() {
		try {
			connectionFactory = new ActiveMQConnectionFactory("vm://localhost");
			connectionFactory.setOptimizeAcknowledge(true);
			connectionFactory.setUseAsyncSend(true);
			connectionFactory.setAlwaysSessionAsync(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
 
	@WebMethod
     public void sendInvocation(InvocationRequest ir) {
 
        try {
            // Create a Connection
            Connection connection = connectionFactory.createConnection();
            connection.start();
 
            // Create a Session
            Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
 
            // Create the destination (Topic or Queue)
            Destination destination =
session.createQueue("queue."+ir.getQdest());
 
            // Create a MessageProducer from the Session to the Topic or
Queue
            MessageProducer producer = session.createProducer(destination);
            //producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
            producer.setDeliveryMode(DeliveryMode.PERSISTENT);
 
            // Create a messages
            JmsPayload payload = new JmsPayload();
 
            String dataString = ir.getService() + "/" + ir.getMethod() + "?"
+ ir.getParam();
            payload.setDataString(dataString);
 
            if (ir.getFileAttachments()  != null) {
            	for (int i = 0; i < ir.getFileAttachments().length; i++) {
            		String url = ir.getFileAttachments()[i];
            		Attachment a = getAttachment(url);
            		if (a != null) payload.addAttachment(a);
            	}
            }
 
            ObjectMessage objmessage = session.createObjectMessage(payload);
 
            // Tell the producer to send the message
            System.out.println("Sending message to: " + ir.getQdest() + "
with values: "+dataString);
            producer.send(objmessage);
 
            // Clean up
            producer.close();
            session.close();
            connection.stop();
            connection.close();
        } catch (Exception e) {
            System.out.println("Caught: " + e);
            e.printStackTrace();
        }
    }
-- 
View this message in context: http://www.nabble.com/Sending-message-from-EJB3%3A-poor-performances-after-a-while-tp16583813s2354p16583813.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.


Re: Sending message from EJB3: poor performances after a while

Posted by James Strachan <ja...@gmail.com>.
See http://activemq.apache.org/how-do-i-use-jms-efficiently.html

On 09/04/2008, James Strachan <ja...@gmail.com> wrote:
> You are not using your J2EE providers JMS proxy to cache things; you
>  are using vanilla JMS.
>
>  So try using the PooledConnectionFactory from ActiveMQ instead.
>
>
>
>  On 09/04/2008, paoletto <pa...@gmail.com> wrote:
>  >
>  >  i wrote the following Stateless Session Bean, and ran in a j2ee application
>  >  on jbossAS.
>  >
>  >  With the following implementation i have the problem that, if for example i
>  >  put the send in a for
>  >  to send 1000 messages (invocations) in a row, after about 200-250 the sender
>  >  start to slow down and at
>  >  about 300th message, it start to take 3-4 minute to send 1 single message.
>  >  then i have to stop the AS,
>  >  cause JVM goes to 100% load and the for cycle does not end.
>  >
>  >  i dont know what i did wrong here..
>  >  But what i can say is that if every time i also create a new
>  >  ActiveMQConnectionFactory, everything
>  >  slowes down quite much, but it does not suffer from the problem before (that
>  >  means, poor but constant performances)
>  >
>  >  any clue?
>  >
>  >
>  >
>  >
>  >
>  >
>  >  @Stateless
>  >  public class JmsFrontendBean  implements JmsFrontendRemote,JmsFrontendLocal
>  >  {
>  >         public static final String RemoteJNDIName =
>  >  JmsFrontendBean.class.getSimpleName() + "/remote";
>  >         public static final String LocalJNDIName =
>  >  JmsFrontendBean.class.getSimpleName() + "/local";
>  >
>  >  //      private Context ctx = null;
>  >         ActiveMQConnectionFactory connectionFactory = null;
>  >
>  >         @PostConstruct
>  >         private void postConstruct() {
>  >                 try {
>  >                         connectionFactory = new ActiveMQConnectionFactory("vm://localhost");
>  >                         connectionFactory.setOptimizeAcknowledge(true);
>  >                         connectionFactory.setUseAsyncSend(true);
>  >                         connectionFactory.setAlwaysSessionAsync(true);
>  >                 } catch (Exception e) {
>  >                         e.printStackTrace();
>  >                 }
>  >         }
>  >
>  >         @WebMethod
>  >      public void sendInvocation(InvocationRequest ir) {
>  >
>  >         try {
>  >             // Create a Connection
>  >             Connection connection = connectionFactory.createConnection();
>  >             connection.start();
>  >
>  >             // Create a Session
>  >             Session session = connection.createSession(false,
>  >  Session.AUTO_ACKNOWLEDGE);
>  >
>  >             // Create the destination (Topic or Queue)
>  >             Destination destination =
>  >  session.createQueue("queue."+ir.getQdest());
>  >
>  >             // Create a MessageProducer from the Session to the Topic or
>  >  Queue
>  >             MessageProducer producer = session.createProducer(destination);
>  >             //producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
>  >             producer.setDeliveryMode(DeliveryMode.PERSISTENT);
>  >
>  >             // Create a messages
>  >             JmsPayload payload = new JmsPayload();
>  >
>  >             String dataString = ir.getService() + "/" + ir.getMethod() + "?"
>  >  + ir.getParam();
>  >             payload.setDataString(dataString);
>  >
>  >             if (ir.getFileAttachments()  != null) {
>  >                 for (int i = 0; i < ir.getFileAttachments().length; i++) {
>  >                         String url = ir.getFileAttachments()[i];
>  >                         Attachment a = getAttachment(url);
>  >                         if (a != null) payload.addAttachment(a);
>  >                 }
>  >             }
>  >
>  >             ObjectMessage objmessage = session.createObjectMessage(payload);
>  >
>  >             // Tell the producer to send the message
>  >             System.out.println("Sending message to: " + ir.getQdest() + "
>  >  with values: "+dataString);
>  >             producer.send(objmessage);
>  >
>  >             // Clean up
>  >             producer.close();
>  >             session.close();
>  >             connection.stop();
>  >             connection.close();
>  >         } catch (Exception e) {
>  >             System.out.println("Caught: " + e);
>  >             e.printStackTrace();
>  >         }
>  >     }
>  >
>  > --
>  >  View this message in context: http://www.nabble.com/Sending-message-from-EJB3%3A-poor-performances-after-a-while-tp16583813s2354p16583813.html
>  >  Sent from the ActiveMQ - User mailing list archive at Nabble.com.
>  >
>  >
>
>
>
> --
>  James
>  -------
>  http://macstrac.blogspot.com/
>
>  Open Source Integration
>  http://open.iona.com
>


-- 
James
-------
http://macstrac.blogspot.com/

Open Source Integration
http://open.iona.com

Re: Sending message from EJB3: poor performances after a while

Posted by James Strachan <ja...@gmail.com>.
You are not using your J2EE providers JMS proxy to cache things; you
are using vanilla JMS.

So try using the PooledConnectionFactory from ActiveMQ instead.


On 09/04/2008, paoletto <pa...@gmail.com> wrote:
>
>  i wrote the following Stateless Session Bean, and ran in a j2ee application
>  on jbossAS.
>
>  With the following implementation i have the problem that, if for example i
>  put the send in a for
>  to send 1000 messages (invocations) in a row, after about 200-250 the sender
>  start to slow down and at
>  about 300th message, it start to take 3-4 minute to send 1 single message.
>  then i have to stop the AS,
>  cause JVM goes to 100% load and the for cycle does not end.
>
>  i dont know what i did wrong here..
>  But what i can say is that if every time i also create a new
>  ActiveMQConnectionFactory, everything
>  slowes down quite much, but it does not suffer from the problem before (that
>  means, poor but constant performances)
>
>  any clue?
>
>
>
>
>
>
>  @Stateless
>  public class JmsFrontendBean  implements JmsFrontendRemote,JmsFrontendLocal
>  {
>         public static final String RemoteJNDIName =
>  JmsFrontendBean.class.getSimpleName() + "/remote";
>         public static final String LocalJNDIName =
>  JmsFrontendBean.class.getSimpleName() + "/local";
>
>  //      private Context ctx = null;
>         ActiveMQConnectionFactory connectionFactory = null;
>
>         @PostConstruct
>         private void postConstruct() {
>                 try {
>                         connectionFactory = new ActiveMQConnectionFactory("vm://localhost");
>                         connectionFactory.setOptimizeAcknowledge(true);
>                         connectionFactory.setUseAsyncSend(true);
>                         connectionFactory.setAlwaysSessionAsync(true);
>                 } catch (Exception e) {
>                         e.printStackTrace();
>                 }
>         }
>
>         @WebMethod
>      public void sendInvocation(InvocationRequest ir) {
>
>         try {
>             // Create a Connection
>             Connection connection = connectionFactory.createConnection();
>             connection.start();
>
>             // Create a Session
>             Session session = connection.createSession(false,
>  Session.AUTO_ACKNOWLEDGE);
>
>             // Create the destination (Topic or Queue)
>             Destination destination =
>  session.createQueue("queue."+ir.getQdest());
>
>             // Create a MessageProducer from the Session to the Topic or
>  Queue
>             MessageProducer producer = session.createProducer(destination);
>             //producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
>             producer.setDeliveryMode(DeliveryMode.PERSISTENT);
>
>             // Create a messages
>             JmsPayload payload = new JmsPayload();
>
>             String dataString = ir.getService() + "/" + ir.getMethod() + "?"
>  + ir.getParam();
>             payload.setDataString(dataString);
>
>             if (ir.getFileAttachments()  != null) {
>                 for (int i = 0; i < ir.getFileAttachments().length; i++) {
>                         String url = ir.getFileAttachments()[i];
>                         Attachment a = getAttachment(url);
>                         if (a != null) payload.addAttachment(a);
>                 }
>             }
>
>             ObjectMessage objmessage = session.createObjectMessage(payload);
>
>             // Tell the producer to send the message
>             System.out.println("Sending message to: " + ir.getQdest() + "
>  with values: "+dataString);
>             producer.send(objmessage);
>
>             // Clean up
>             producer.close();
>             session.close();
>             connection.stop();
>             connection.close();
>         } catch (Exception e) {
>             System.out.println("Caught: " + e);
>             e.printStackTrace();
>         }
>     }
>
> --
>  View this message in context: http://www.nabble.com/Sending-message-from-EJB3%3A-poor-performances-after-a-while-tp16583813s2354p16583813.html
>  Sent from the ActiveMQ - User mailing list archive at Nabble.com.
>
>


-- 
James
-------
http://macstrac.blogspot.com/

Open Source Integration
http://open.iona.com