diff --git a/org.springframework.integration.jdbc/pom.xml b/org.springframework.integration.jdbc/pom.xml index 158b79cbf4..c4e45386c0 100644 --- a/org.springframework.integration.jdbc/pom.xml +++ b/org.springframework.integration.jdbc/pom.xml @@ -55,6 +55,12 @@ spring-integration-core ${project.version} + + org.springframework.integration + spring-integration-test + ${project.version} + test + org.springframework spring-aop @@ -87,5 +93,11 @@ 1.8.0 test + + log4j + log4j + 1.2.15 + test + diff --git a/org.springframework.integration.jdbc/src/main/java/org/springframework/integration/jdbc/JdbcMessageStore.java b/org.springframework.integration.jdbc/src/main/java/org/springframework/integration/jdbc/JdbcMessageStore.java index c1e4cdd8c3..df43440a61 100644 --- a/org.springframework.integration.jdbc/src/main/java/org/springframework/integration/jdbc/JdbcMessageStore.java +++ b/org.springframework.integration.jdbc/src/main/java/org/springframework/integration/jdbc/JdbcMessageStore.java @@ -6,6 +6,7 @@ import java.security.NoSuchAlgorithmException; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Timestamp; import java.sql.Types; import java.util.List; import java.util.UUID; @@ -45,14 +46,14 @@ public class JdbcMessageStore implements MessageStore { */ public static final String DEFAULT_TABLE_PREFIX = "INT_"; - private static final String LIST_MESSAGES_BY_CORRELATION_KEY = "SELECT MESSAGE_ID, CORRELATION_KEY, MESSAGE_BYTES from %PREFIX%MESSAGE where CORRELATION_KEY=?"; + private static final String LIST_MESSAGES_BY_CORRELATION_KEY = "SELECT MESSAGE_ID, CREATED_DATE, CORRELATION_KEY, MESSAGE_BYTES from %PREFIX%MESSAGE where CORRELATION_KEY=?"; - private static final String GET_MESSAGE = "SELECT MESSAGE_ID, CORRELATION_KEY, MESSAGE_BYTES from %PREFIX%MESSAGE where MESSAGE_ID=?"; + private static final String GET_MESSAGE = "SELECT MESSAGE_ID, CREATED_DATE, CORRELATION_KEY, MESSAGE_BYTES from %PREFIX%MESSAGE where MESSAGE_ID=?"; private static final String DELETE_MESSAGE = "DELETE from %PREFIX%MESSAGE where MESSAGE_ID=?"; - private static final String CREATE_MESSAGE = "INSERT into %PREFIX%MESSAGE(MESSAGE_ID, CORRELATION_KEY, MESSAGE_BYTES)" - + " values (?, ?, ?)"; + private static final String CREATE_MESSAGE = "INSERT into %PREFIX%MESSAGE(MESSAGE_ID, CREATED_DATE, CORRELATION_KEY, MESSAGE_BYTES)" + + " values (?, ?, ?, ?)"; public static final int DEFAULT_LONG_STRING_LENGTH = 2500; @@ -62,6 +63,12 @@ public class JdbcMessageStore implements MessageStore { */ public static final String SAVED_KEY = JdbcMessageStore.class.getSimpleName() + ".SAVED"; + /** + * The name of the message header that stores a timestamp for the time the + * message was inserted. + */ + public static final String CREATED_DATE_KEY = JdbcMessageStore.class.getSimpleName() + ".CREATED_DATE"; + private String tablePrefix = DEFAULT_TABLE_PREFIX; private JdbcOperations jdbcTemplate; @@ -192,7 +199,9 @@ public class JdbcMessageStore implements MessageStore { } } - Message result = MessageBuilder.fromMessage(message).setHeader(SAVED_KEY, Boolean.TRUE).build(); + final long createdDate = System.currentTimeMillis(); + Message result = MessageBuilder.fromMessage(message).setHeader(SAVED_KEY, Boolean.TRUE).setHeader( + CREATED_DATE_KEY, new Long(createdDate)).build(); final String messageId = getKey(result.getHeaders().getId()); final String correlationId = getKey(result.getHeaders().getCorrelationId()); final byte[] messageBytes = SerializationUtils.serialize(result); @@ -201,8 +210,9 @@ public class JdbcMessageStore implements MessageStore { public void setValues(PreparedStatement ps) throws SQLException { logger.debug("Inserting message with id key=" + messageId); ps.setString(1, messageId); - ps.setString(2, correlationId); - lobHandler.getLobCreator().setBlobAsBytes(ps, 3, messageBytes); + ps.setTimestamp(2, new Timestamp(createdDate)); + ps.setString(3, correlationId); + lobHandler.getLobCreator().setBlobAsBytes(ps, 4, messageBytes); } }); diff --git a/org.springframework.integration.jdbc/src/main/resources/org/springframework/integration/jdbc/schema-derby.sql b/org.springframework.integration.jdbc/src/main/resources/org/springframework/integration/jdbc/schema-derby.sql index 9900200c49..71bdeb7b5f 100644 --- a/org.springframework.integration.jdbc/src/main/resources/org/springframework/integration/jdbc/schema-derby.sql +++ b/org.springframework.integration.jdbc/src/main/resources/org/springframework/integration/jdbc/schema-derby.sql @@ -1,5 +1,6 @@ CREATE TABLE INT_MESSAGE ( MESSAGE_ID VARCHAR(100) NOT NULL PRIMARY KEY, + CREATED_DATE TIMESTAMP NOT NULL, CORRELATION_KEY VARCHAR(100), MESSAGE_BYTES BLOB ); diff --git a/org.springframework.integration.jdbc/src/test/java/org/springframework/integration/jdbc/JdbcMessageStoreTests.java b/org.springframework.integration.jdbc/src/test/java/org/springframework/integration/jdbc/JdbcMessageStoreTests.java index f6731081b1..9dac0d85cd 100644 --- a/org.springframework.integration.jdbc/src/test/java/org/springframework/integration/jdbc/JdbcMessageStoreTests.java +++ b/org.springframework.integration.jdbc/src/test/java/org/springframework/integration/jdbc/JdbcMessageStoreTests.java @@ -5,7 +5,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; -import static org.springframework.integration.test.matcher.PayloadAndHeaderMatcher.sameExceptImmutableHeaders; +import static org.springframework.integration.test.matcher.PayloadAndHeaderMatcher.sameExceptIgnorableHeaders; import java.util.UUID; @@ -50,7 +50,9 @@ public class JdbcMessageStoreTests { assertNull(messageStore.get(message.getHeaders().getId())); Message result = messageStore.get(saved.getHeaders().getId()); assertNotNull(result); - assertThat(saved, sameExceptImmutableHeaders(result)); + assertThat(saved, sameExceptIgnorableHeaders(result)); + assertNotNull(result.getHeaders().get(JdbcMessageStore.SAVED_KEY)); + assertNotNull(result.getHeaders().get(JdbcMessageStore.CREATED_DATE_KEY)); } @Test @@ -80,7 +82,7 @@ public class JdbcMessageStoreTests { Message copy = MessageBuilder.fromMessage(saved).build(); Message result = messageStore.put(copy); assertNotSame(copy, result); - assertThat(saved, sameExceptImmutableHeaders(result)); + assertThat(saved, sameExceptIgnorableHeaders(result, JdbcMessageStore.CREATED_DATE_KEY)); assertNotNull(messageStore.get(saved.getHeaders().getId())); } diff --git a/org.springframework.integration.test/.classpath b/org.springframework.integration.test/.classpath index a276ed784b..ddc9103c5c 100644 --- a/org.springframework.integration.test/.classpath +++ b/org.springframework.integration.test/.classpath @@ -1,26 +1,10 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - diff --git a/org.springframework.integration.test/.project b/org.springframework.integration.test/.project index b588dbf073..c16d5fcfc5 100644 --- a/org.springframework.integration.test/.project +++ b/org.springframework.integration.test/.project @@ -1,6 +1,6 @@ - org.springframework.integration.test + spring-integration-test @@ -15,8 +15,14 @@ + + org.maven.ide.eclipse.maven2Builder + + + + org.maven.ide.eclipse.maven2Nature org.springframework.ide.eclipse.core.springnature org.eclipse.jdt.core.javanature diff --git a/org.springframework.integration.test/src/main/java/org/springframework/integration/test/matcher/PayloadAndHeaderMatcher.java b/org.springframework.integration.test/src/main/java/org/springframework/integration/test/matcher/PayloadAndHeaderMatcher.java index 6fbc9cb6c7..4f84df2147 100644 --- a/org.springframework.integration.test/src/main/java/org/springframework/integration/test/matcher/PayloadAndHeaderMatcher.java +++ b/org.springframework.integration.test/src/main/java/org/springframework/integration/test/matcher/PayloadAndHeaderMatcher.java @@ -14,7 +14,7 @@ import org.springframework.integration.core.Message; import org.springframework.integration.core.MessageHeaders; /** - * Matcher to make assertions about message equality easier. Usage: + * Matcher to make assertions about message equality easier. Usage: * *
  * @Test
@@ -29,21 +29,25 @@ import org.springframework.integration.core.MessageHeaders;
  *   return new PayloadAndHeaderMatcher(expected);
  * }
  * 
- * + * * @author Dave Syer - * + * */ public class PayloadAndHeaderMatcher extends BaseMatcher> { private final Object payload; + private final Map headers; + private final String[] ignoreKeys; + @Factory - public static Matcher> sameExceptImmutableHeaders(Message expected) { - return new PayloadAndHeaderMatcher(expected); + public static Matcher> sameExceptIgnorableHeaders(Message expected, String... ignoreKeys) { + return new PayloadAndHeaderMatcher(expected, ignoreKeys); } - private PayloadAndHeaderMatcher(Message expected) { + private PayloadAndHeaderMatcher(Message expected, String... ignoreKeys) { + this.ignoreKeys = ignoreKeys; this.payload = expected.getPayload(); this.headers = getHeaders(expected); } @@ -52,6 +56,9 @@ public class PayloadAndHeaderMatcher extends BaseMatcher> { HashMap headers = new HashMap(operand.getHeaders()); headers.remove(MessageHeaders.ID); headers.remove(MessageHeaders.TIMESTAMP); + for (String key : ignoreKeys) { + headers.remove(key); + } return headers; } @@ -62,7 +69,8 @@ public class PayloadAndHeaderMatcher extends BaseMatcher> { } public void describeTo(Description description) { - description.appendText("a Message with Headers that match except ID and timestamp for payload: ").appendValue(payload).appendText(" and headers: ").appendValue(headers); + description.appendText("a Message with Headers that match except ID and timestamp for payload: ").appendValue( + payload).appendText(" and headers: ").appendValue(headers); } - + } \ No newline at end of file