ACTIVEMQ6-95 Large Message doesn't work on clustering & null Persistence

https://issues.apache.org/jira/browse/ACTIVEMQ6-95

The message.copy is broken when you set persistence=false, and the bridge will use that method before forwarding the message
this commit is fixing NullStorageLargeServerMessage.copy and adding the proper testcase to validate the fix
This commit is contained in:
Clebert Suconic 2015-03-31 11:20:25 -04:00
parent ce0c3d9e63
commit dea60ed3b6
3 changed files with 104 additions and 3 deletions

View File

@ -19,6 +19,7 @@ package org.apache.activemq.core.persistence.impl.nullpm;
import org.apache.activemq.api.core.ActiveMQBuffers;
import org.apache.activemq.core.journal.SequentialFile;
import org.apache.activemq.core.server.LargeServerMessage;
import org.apache.activemq.core.server.ServerMessage;
import org.apache.activemq.core.server.impl.ServerMessageImpl;
class NullStorageLargeServerMessage extends ServerMessageImpl implements LargeServerMessage
@ -29,6 +30,11 @@ class NullStorageLargeServerMessage extends ServerMessageImpl implements LargeSe
super();
}
public NullStorageLargeServerMessage(NullStorageLargeServerMessage other)
{
super(other);
}
@Override
public void releaseResources()
{
@ -79,7 +85,13 @@ class NullStorageLargeServerMessage extends ServerMessageImpl implements LargeSe
@Override
public String toString()
{
return "LargeServerMessage[messageID=" + messageID + ", durable=" + durable + ", address=" + getAddress() + ",properties=" + properties.toString() + "]";
return "NullStorageLargeServerMessage[messageID=" + messageID + ", durable=" + durable + ", address=" + getAddress() + ",properties=" + properties.toString() + "]";
}
public ServerMessage copy()
{
// This is a simple copy, used only to avoid changing original properties
return new NullStorageLargeServerMessage(this);
}
@Override

View File

@ -282,7 +282,7 @@ public abstract class UnitTestCase extends CoreUnitTestCase
* @return
* @throws Exception
*/
protected final ConfigurationImpl createBasicConfig(final int serverID)
protected ConfigurationImpl createBasicConfig(final int serverID)
{
ConfigurationImpl configuration = new ConfigurationImpl()
.setSecurityEnabled(false)

View File

@ -18,23 +18,62 @@ package org.apache.activemq.tests.integration.jms.cluster;
import javax.jms.BytesMessage;
import javax.jms.Connection;
import javax.jms.MapMessage;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import java.util.Arrays;
import java.util.Collection;
import org.apache.activemq.api.core.TransportConfiguration;
import org.apache.activemq.api.jms.ActiveMQJMSClient;
import org.apache.activemq.api.jms.JMSFactoryType;
import org.apache.activemq.core.config.ClusterConnectionConfiguration;
import org.apache.activemq.core.config.Configuration;
import org.apache.activemq.core.config.impl.ConfigurationImpl;
import org.apache.activemq.jms.client.ActiveMQConnectionFactory;
import org.apache.activemq.tests.util.JMSClusteredTestBase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(value = Parameterized.class)
public class LargeMessageOverBridgeTest extends JMSClusteredTestBase
{
private final boolean persistent;
@Override
protected boolean enablePersistence()
{
return persistent;
}
@Parameterized.Parameters(name = "persistent={0}")
public static Collection getParameters()
{
return Arrays.asList(new Object[][]{
{true},
{false}
});
}
@Override
protected final ConfigurationImpl createBasicConfig(final int serverID)
{
ConfigurationImpl configuration = super.createBasicConfig(serverID);
configuration.setJournalFileSize(1024 * 1024);
return configuration;
}
public LargeMessageOverBridgeTest(boolean persistent)
{
this.persistent = persistent;
}
/**
* This was causing a text message to ber eventually converted into large message when sent over the bridge
*
@ -78,6 +117,56 @@ public class LargeMessageOverBridgeTest extends JMSClusteredTestBase
}
/**
* This was causing a text message to ber eventually converted into large message when sent over the bridge
*
* @throws Exception
*/
@Test
public void testSendMapMessageOverCluster() throws Exception
{
createQueue("Q1");
Queue queue = (Queue)context1.lookup("queue/Q1");
Connection conn1 = cf1.createConnection();
Session session1 = conn1.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer prod1 = session1.createProducer(queue);
Connection conn2 = cf2.createConnection();
Session session2 = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer cons2 = session2.createConsumer(queue);
conn2.start();
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < 3810002; i++)
{
buffer.append('a');
}
final int NUMBER_OF_MESSAGES = 1;
for (int i = 0; i < NUMBER_OF_MESSAGES; i++)
{
MapMessage msg = session1.createMapMessage();
msg.setString("str", buffer.toString());
msg.setIntProperty("i", i);
prod1.send(msg);
}
for (int i = 0; i < NUMBER_OF_MESSAGES; i++)
{
MapMessage msg = (MapMessage)cons2.receive(5000);
assertEquals(buffer.toString(), msg.getString("str"));
}
assertNull(cons2.receiveNoWait());
conn1.close();
conn2.close();
}
protected Configuration createConfigServer2()
{
@ -156,7 +245,7 @@ public class LargeMessageOverBridgeTest extends JMSClusteredTestBase
for (int i = 0; i < 5; i++)
{
BytesMessage msg2 = (BytesMessage) cons2.receive(10000);
BytesMessage msg2 = (BytesMessage) cons2.receive(5000);
assertNotNull(msg2);
msg2.acknowledge();