RESOLVED - issue INT-1058, INT-1098: message ID is unique to an immutable instance

This commit is contained in:
David Syer
2010-04-27 11:58:37 +00:00
parent c9c3da0fe7
commit 42113a497c
27 changed files with 435 additions and 189 deletions

View File

@@ -19,10 +19,11 @@ package org.springframework.integration.ip;
import org.springframework.integration.core.MessageHeaders;
/**
* Headers for Messages mapped from UDP datagram packets.
* Headers for Messages mapped from IP datagram packets.
*
* @author Mark Fisher
* @author Gary Russell
* @author Dave Syer
* @since 2.0
*/
public abstract class IpHeaders {
@@ -41,6 +42,8 @@ public abstract class IpHeaders {
public static final String ACK_ADDRESS = IP + "ackTo";
public static final String ACK_ID = IP + "ackId";
public static final String REMOTE_PORT = TCP + "remote_port";
}

View File

@@ -53,6 +53,7 @@ import org.springframework.util.Assert;
*
* @author Mark Fisher
* @author Gary Russell
* @author Dave Syer
* @since 2.0
*/
public class DatagramPacketMessageMapper implements InboundMessageMapper<DatagramPacket>,
@@ -187,7 +188,7 @@ public class DatagramPacketMessageMapper implements InboundMessageMapper<Datagra
payload = new byte[length];
System.arraycopy(packet.getData(), offset + matcher.end(), payload, 0, length);
message = MessageBuilder.withPayload(payload)
.setHeader(MessageHeaders.ID, UUID.fromString(matcher.group(2)))
.setHeader(IpHeaders.ACK_ID, UUID.fromString(matcher.group(2)))
.setHeader(IpHeaders.ACK_ADDRESS, matcher.group(1))
.setHeader(IpHeaders.HOSTNAME, packet.getAddress().getHostName())
.setHeader(IpHeaders.IP_ADDRESS, packet.getAddress().getHostAddress())

View File

@@ -125,7 +125,7 @@ public class UnicastReceivingChannelAdapter extends AbstractInternetProtocolRece
protected void sendAck(Message<byte[]> message) {
MessageHeaders headers = message.getHeaders();
Object id = headers.getId();
Object id = headers.get(IpHeaders.ACK_ID);
byte[] ack = id.toString().getBytes();
String ackAddress = ((String) headers.get(IpHeaders.ACK_ADDRESS)).trim();
Matcher mat = addressPattern.matcher(ackAddress);

View File

@@ -28,20 +28,34 @@ import org.junit.Test;
import org.springframework.integration.adapter.MessageMappingException;
import org.springframework.integration.core.Message;
import org.springframework.integration.ip.IpHeaders;
import org.springframework.integration.ip.udp.DatagramPacketMessageMapper;
import org.springframework.integration.message.MessageBuilder;
/**
* @author Gary Russell
* @author Dave Syer
* @since 2.0
*/
public class DatagramPacketMessageMapperTests {
@Test
public void testFromToMessage() throws Exception {
public void testFromToMessageNoAckNoLengthCheck() throws Exception {
test(false, false);
}
@Test
public void testFromToMessageAckNoLengthCheck() throws Exception {
test(true, false);
}
@Test
public void testFromToMessageNoAckLengthCheck() throws Exception {
test(false, true);
}
@Test
public void testFromToMessageAckLengthCheck() throws Exception {
test(true, true);
}
@@ -56,8 +70,8 @@ public class DatagramPacketMessageMapperTests {
Message<byte[]> messageOut = mapper.toMessage(packet);
assertEquals(new String(message.getPayload()), new String(messageOut.getPayload()));
if (ack) {
assertEquals(message.getHeaders().getId().toString(),
messageOut.getHeaders().getId().toString());
assertEquals(messageOut.getHeaders().get(IpHeaders.ACK_ID).toString(),
message.getHeaders().getId().toString());
}
}

View File

@@ -34,6 +34,7 @@ import org.junit.Ignore;
import org.junit.Test;
import org.springframework.integration.core.Message;
import org.springframework.integration.ip.IpHeaders;
import org.springframework.integration.ip.udp.DatagramPacketMessageMapper;
import org.springframework.integration.ip.udp.MulticastSendingMessageHandler;
import org.springframework.integration.ip.udp.UnicastSendingMessageHandler;
@@ -100,7 +101,7 @@ public class DatagramPacketSendingHandlerTests {
mapper.setAcknowledge(true);
mapper.setLengthCheck(true);
Message<byte[]> message = mapper.toMessage(receivedPacket);
Object id = message.getHeaders().getId();
Object id = message.getHeaders().get(IpHeaders.ACK_ID);
byte[] ack = id.toString().getBytes();
DatagramPacket ackPack = new DatagramPacket(ack, ack.length,
new InetSocketAddress("localHost", ackPort));
@@ -201,7 +202,7 @@ public class DatagramPacketSendingHandlerTests {
mapper.setAcknowledge(true);
mapper.setLengthCheck(true);
Message<byte[]> message = mapper.toMessage(receivedPacket);
Object id = message.getHeaders().getId();
Object id = message.getHeaders().get(IpHeaders.ACK_ID);
byte[] ack = id.toString().getBytes();
DatagramPacket ackPack = new DatagramPacket(ack, ack.length,
new InetSocketAddress("localHost", ackPort));

View File

@@ -35,7 +35,7 @@
acknowledge="true"
ack-host="localhost"
ack-port="22222"
ack-timeout="10000"
ack-timeout="2000"
channel="outputChannel"/>
<beans:import resource="testIp-common-context.xml" />