activemq-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ryan Stewart <rds6...@gmail.com>
Subject Re: VM transport not using pass-by-reference
Date Sat, 24 May 2008 03:59:40 GMT


Ryan Stewart wrote:
> 
> I'm trying to use an embedded ActiveMQ instance for some lightweight
> message handling...
> 

Here is a simple test case that exhibits the problem. Unfortunately you'll
need some sort of profiler to see the actual problem. When I run this test,
I get 2001 ActiveMQTextMessages. If I use a normal consumer instead of a
durable subscriber (call session.createConsumer instead of
session.createDurableSubscriber), I only get 1001 messages.

Test code follows:
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class MessageByReferenceTest {
    
    private ActiveMQConnection producerConnection;
    private List<ActiveMQConnection> consumerConnections = new
ArrayList<ActiveMQConnection>();
    private MessageProducer producer;
    private TextMessage message;

    @Before
    public void setUp() throws JMSException {
        ActiveMQConnectionFactory factory = new
ActiveMQConnectionFactory("vm://default");
        
        producerConnection = (ActiveMQConnection)
factory.createConnection();
        producerConnection.setCopyMessageOnSend(false);
        Session producerSession = producerConnection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
        Destination producerDestination =
producerSession.createTopic("test.topic");
        producer = producerSession.createProducer(producerDestination);
        message = producerSession.createTextMessage("some text");
        
        for (int i = 0; i < 10; i++) {
            ActiveMQConnection consumerConnection = (ActiveMQConnection)
factory.createConnection();
            consumerConnections.add(consumerConnection);
            consumerConnection.setCopyMessageOnSend(true);
            consumerConnection.setClientID(Integer.toString(i));
            Session consumerSession =
consumerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            Topic consumerDestination =
consumerSession.createTopic("test.topic");
            MessageConsumer consumer =
consumerSession.createDurableSubscriber(consumerDestination, "foo");
            consumerConnection.start();
        }
    }
    
    @After
    public void tearDown() throws JMSException {
        producerConnection.stop();
        for (Connection connection : consumerConnections) {
            connection.stop();
        }
    }
    
    @Test
    public void testPassingByReference() throws JMSException, IOException {
        for (int i = 0; i < 100; i++) {
            producer.send(message);
        }
        System.out.println("Check the number of ActiveMQTextMessage objects
in memory now; enter to exit");
        System.in.read();
    }
}

-- 
View this message in context: http://www.nabble.com/VM-transport-not-using-pass-by-reference-tp17442075s2354p17444209.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.


Mime
View raw message