diff --git a/spring-integration-jdbc/src/main/java/org/springframework/integration/jdbc/lock/DefaultLockRepository.java b/spring-integration-jdbc/src/main/java/org/springframework/integration/jdbc/lock/DefaultLockRepository.java index e9ce4d885d..cb06d50fb6 100644 --- a/spring-integration-jdbc/src/main/java/org/springframework/integration/jdbc/lock/DefaultLockRepository.java +++ b/spring-integration-jdbc/src/main/java/org/springframework/integration/jdbc/lock/DefaultLockRepository.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 the original author or authors. + * Copyright 2016-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -78,22 +78,43 @@ public class DefaultLockRepository private String region = "DEFAULT"; - private String deleteQuery = "DELETE FROM %sLOCK WHERE REGION=? AND LOCK_KEY=? AND CLIENT_ID=?"; + private String deleteQuery = """ + DELETE FROM %sLOCK + WHERE REGION=? AND LOCK_KEY=? AND CLIENT_ID=? + """; - private String deleteExpiredQuery = "DELETE FROM %sLOCK WHERE REGION=? AND CREATED_DATE=?"; + private String countQuery = """ + SELECT COUNT(REGION) + FROM %sLOCK + WHERE REGION=? AND LOCK_KEY=? AND CLIENT_ID=? AND CREATED_DATE>=? + """; - private String renewQuery = "UPDATE %sLOCK SET CREATED_DATE=? WHERE REGION=? AND LOCK_KEY=? AND CLIENT_ID=?"; + private String renewQuery = """ + UPDATE %sLOCK + SET CREATED_DATE=? + WHERE REGION=? AND LOCK_KEY=? AND CLIENT_ID=? + """; private ApplicationContext applicationContext; diff --git a/spring-integration-jdbc/src/main/java/org/springframework/integration/jdbc/metadata/JdbcMetadataStore.java b/spring-integration-jdbc/src/main/java/org/springframework/integration/jdbc/metadata/JdbcMetadataStore.java index bb4a063524..f27b28578d 100644 --- a/spring-integration-jdbc/src/main/java/org/springframework/integration/jdbc/metadata/JdbcMetadataStore.java +++ b/spring-integration-jdbc/src/main/java/org/springframework/integration/jdbc/metadata/JdbcMetadataStore.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2019 the original author or authors. + * Copyright 2017-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -58,22 +58,40 @@ public class JdbcMetadataStore implements ConcurrentMetadataStore, InitializingB private String lockHint = "FOR UPDATE"; - private String getValueQuery = "SELECT METADATA_VALUE FROM %sMETADATA_STORE WHERE METADATA_KEY=? AND REGION=?"; + private String getValueQuery = """ + SELECT METADATA_VALUE FROM %sMETADATA_STORE + WHERE METADATA_KEY=? AND REGION=? + """; - private String getValueForUpdateQuery = - "SELECT METADATA_VALUE FROM %sMETADATA_STORE WHERE METADATA_KEY=? AND REGION=? %s"; + private String getValueForUpdateQuery = """ + SELECT METADATA_VALUE FROM %sMETADATA_STORE + WHERE METADATA_KEY=? AND REGION=? %s + """; - private String replaceValueQuery = - "UPDATE %sMETADATA_STORE SET METADATA_VALUE=? WHERE METADATA_KEY=? AND METADATA_VALUE=? AND REGION=?"; + private String replaceValueQuery = """ + UPDATE %sMETADATA_STORE + SET METADATA_VALUE=? + WHERE METADATA_KEY=? AND METADATA_VALUE=? AND REGION=? + """; - private String replaceValueByKeyQuery = - "UPDATE %sMETADATA_STORE SET METADATA_VALUE=? WHERE METADATA_KEY=? AND REGION=?"; + private String replaceValueByKeyQuery = """ + UPDATE %sMETADATA_STORE + SET METADATA_VALUE=? + WHERE METADATA_KEY=? AND REGION=? + """; - private String removeValueQuery = "DELETE FROM %sMETADATA_STORE WHERE METADATA_KEY=? AND REGION=?"; + private String removeValueQuery = """ + DELETE FROM %sMETADATA_STORE + WHERE METADATA_KEY=? AND REGION=? + """; - private String putIfAbsentValueQuery = - "INSERT INTO %sMETADATA_STORE(METADATA_KEY, METADATA_VALUE, REGION) " - + "SELECT ?, ?, ? FROM %sMETADATA_STORE WHERE METADATA_KEY=? AND REGION=? HAVING COUNT(*)=0"; + private String putIfAbsentValueQuery = """ + INSERT INTO %sMETADATA_STORE(METADATA_KEY, METADATA_VALUE, REGION) + SELECT ?, ?, ? + FROM %sMETADATA_STORE + WHERE METADATA_KEY=? AND REGION=? + HAVING COUNT(*)=0 + """; /** * Instantiate a {@link JdbcMetadataStore} using provided dataSource {@link DataSource}. diff --git a/spring-integration-jdbc/src/main/java/org/springframework/integration/jdbc/store/JdbcMessageStore.java b/spring-integration-jdbc/src/main/java/org/springframework/integration/jdbc/store/JdbcMessageStore.java index 14dcca850c..2f70853758 100644 --- a/spring-integration-jdbc/src/main/java/org/springframework/integration/jdbc/store/JdbcMessageStore.java +++ b/spring-integration-jdbc/src/main/java/org/springframework/integration/jdbc/store/JdbcMessageStore.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -85,72 +85,137 @@ public class JdbcMessageStore extends AbstractMessageGroupStore implements Messa public static final String DEFAULT_TABLE_PREFIX = "INT_"; private enum Query { - CREATE_MESSAGE_GROUP("INSERT into %PREFIX%MESSAGE_GROUP" + - "(GROUP_KEY, REGION, COMPLETE, LAST_RELEASED_SEQUENCE, CREATED_DATE, UPDATED_DATE)" - + " values (?, ?, 0, 0, ?, ?)"), + CREATE_MESSAGE_GROUP(""" + INSERT into %PREFIX%MESSAGE_GROUP( + GROUP_KEY, REGION, COMPLETE, LAST_RELEASED_SEQUENCE, CREATED_DATE, UPDATED_DATE) + values (?, ?, 0, 0, ?, ?) + """), - UPDATE_MESSAGE_GROUP("UPDATE %PREFIX%MESSAGE_GROUP set UPDATED_DATE=?, GROUP_CONDITION=? " + - "where GROUP_KEY=? and REGION=?"), + UPDATE_MESSAGE_GROUP(""" + UPDATE %PREFIX%MESSAGE_GROUP + set UPDATED_DATE=?, GROUP_CONDITION=? + where GROUP_KEY=? and REGION=? + """), - REMOVE_MESSAGE_FROM_GROUP("DELETE from %PREFIX%GROUP_TO_MESSAGE where GROUP_KEY=? and MESSAGE_ID=? and " + - "REGION=?"), + REMOVE_MESSAGE_FROM_GROUP(""" + DELETE from %PREFIX%GROUP_TO_MESSAGE + where GROUP_KEY=? and MESSAGE_ID=? and REGION=? + """), - REMOVE_GROUP_TO_MESSAGE_JOIN("DELETE from %PREFIX%GROUP_TO_MESSAGE where GROUP_KEY=? and REGION=?"), + REMOVE_GROUP_TO_MESSAGE_JOIN(""" + DELETE from %PREFIX%GROUP_TO_MESSAGE + where GROUP_KEY=? and REGION=? + """), - COUNT_ALL_MESSAGES_IN_GROUPS("SELECT COUNT(MESSAGE_ID) from %PREFIX%GROUP_TO_MESSAGE where REGION=?"), + COUNT_ALL_MESSAGES_IN_GROUPS(""" + SELECT COUNT(MESSAGE_ID) + from %PREFIX%GROUP_TO_MESSAGE + where REGION=? + """), - COUNT_ALL_MESSAGES_IN_GROUP("SELECT COUNT(MESSAGE_ID) from %PREFIX%GROUP_TO_MESSAGE where GROUP_KEY=? and " + - "REGION=?"), + COUNT_ALL_MESSAGES_IN_GROUP(""" + SELECT COUNT(MESSAGE_ID) + from %PREFIX%GROUP_TO_MESSAGE + where GROUP_KEY=? and REGION=? + """), - LIST_MESSAGES_BY_GROUP_KEY("SELECT MESSAGE_ID, MESSAGE_BYTES, CREATED_DATE " + - "from %PREFIX%MESSAGE where MESSAGE_ID in " + - "(SELECT MESSAGE_ID from %PREFIX%GROUP_TO_MESSAGE where GROUP_KEY = ? and REGION = ?) and REGION = ? " + - "ORDER BY CREATED_DATE"), + LIST_MESSAGES_BY_GROUP_KEY(""" + SELECT MESSAGE_ID, MESSAGE_BYTES, CREATED_DATE + from %PREFIX%MESSAGE + where MESSAGE_ID in (SELECT MESSAGE_ID from %PREFIX%GROUP_TO_MESSAGE where GROUP_KEY = ? and REGION = ?) + and REGION = ? + ORDER BY CREATED_DATE + """), - POLL_FROM_GROUP("SELECT %PREFIX%MESSAGE.MESSAGE_ID, %PREFIX%MESSAGE.MESSAGE_BYTES from %PREFIX%MESSAGE " + - "where %PREFIX%MESSAGE.MESSAGE_ID = " + - "(SELECT min(m.MESSAGE_ID) from %PREFIX%MESSAGE m " + - "join %PREFIX%GROUP_TO_MESSAGE on m.MESSAGE_ID = %PREFIX%GROUP_TO_MESSAGE.MESSAGE_ID " + - "where CREATED_DATE = " + - "(SELECT min(CREATED_DATE) from %PREFIX%MESSAGE, %PREFIX%GROUP_TO_MESSAGE " + - "where %PREFIX%MESSAGE.MESSAGE_ID = %PREFIX%GROUP_TO_MESSAGE.MESSAGE_ID " + - "and %PREFIX%GROUP_TO_MESSAGE.GROUP_KEY = ? " + - "and %PREFIX%MESSAGE.REGION = ?) " + - "and %PREFIX%GROUP_TO_MESSAGE.GROUP_KEY = ? " + - "and m.REGION = ?)"), + POLL_FROM_GROUP(""" + SELECT %PREFIX%MESSAGE.MESSAGE_ID, %PREFIX%MESSAGE.MESSAGE_BYTES + from %PREFIX%MESSAGE + where %PREFIX%MESSAGE.MESSAGE_ID = ( + SELECT min(m.MESSAGE_ID) + from %PREFIX%MESSAGE m + join %PREFIX%GROUP_TO_MESSAGE + on m.MESSAGE_ID = %PREFIX%GROUP_TO_MESSAGE.MESSAGE_ID + where CREATED_DATE = ( + SELECT min(CREATED_DATE) + from %PREFIX%MESSAGE, %PREFIX%GROUP_TO_MESSAGE + where %PREFIX%MESSAGE.MESSAGE_ID = %PREFIX%GROUP_TO_MESSAGE.MESSAGE_ID + and %PREFIX%GROUP_TO_MESSAGE.GROUP_KEY = ? and %PREFIX%MESSAGE.REGION = ?) + and %PREFIX%GROUP_TO_MESSAGE.GROUP_KEY = ? and m.REGION = ?) + """), - GET_GROUP_INFO("SELECT COMPLETE, LAST_RELEASED_SEQUENCE, CREATED_DATE, UPDATED_DATE, GROUP_CONDITION" + - " from %PREFIX%MESSAGE_GROUP where GROUP_KEY=? and REGION=?"), + GET_GROUP_INFO(""" + SELECT COMPLETE, LAST_RELEASED_SEQUENCE, CREATED_DATE, UPDATED_DATE, GROUP_CONDITION + from %PREFIX%MESSAGE_GROUP + where GROUP_KEY=? and REGION=? + """), - GET_MESSAGE("SELECT MESSAGE_ID, CREATED_DATE, MESSAGE_BYTES from %PREFIX%MESSAGE where MESSAGE_ID=? and " + - "REGION=?"), + GET_MESSAGE(""" + SELECT MESSAGE_ID, CREATED_DATE, MESSAGE_BYTES + from %PREFIX%MESSAGE + where MESSAGE_ID=? and REGION=? + """), - GET_MESSAGE_COUNT("SELECT COUNT(MESSAGE_ID) from %PREFIX%MESSAGE where REGION=?"), + GET_MESSAGE_COUNT(""" + SELECT COUNT(MESSAGE_ID) + from %PREFIX%MESSAGE + where REGION=? + """), - DELETE_MESSAGE("DELETE from %PREFIX%MESSAGE where MESSAGE_ID=? and REGION=?"), + DELETE_MESSAGE(""" + DELETE from %PREFIX%MESSAGE + where MESSAGE_ID=? and REGION=? + """), - CREATE_MESSAGE("INSERT into %PREFIX%MESSAGE(MESSAGE_ID, REGION, CREATED_DATE, MESSAGE_BYTES)" - + " values (?, ?, ?, ?)"), + CREATE_MESSAGE(""" + INSERT into %PREFIX%MESSAGE(MESSAGE_ID, REGION, CREATED_DATE, MESSAGE_BYTES) + values (?, ?, ?, ?) + """), - COUNT_ALL_GROUPS("SELECT COUNT(GROUP_KEY) from %PREFIX%MESSAGE_GROUP where REGION=?"), + COUNT_ALL_GROUPS(""" + SELECT COUNT(GROUP_KEY) + from %PREFIX%MESSAGE_GROUP + where REGION=? + """), - COMPLETE_GROUP("UPDATE %PREFIX%MESSAGE_GROUP set UPDATED_DATE=?, COMPLETE=1 where GROUP_KEY=? and REGION=?"), + COMPLETE_GROUP(""" + UPDATE %PREFIX%MESSAGE_GROUP + set UPDATED_DATE=?, COMPLETE=1 + where GROUP_KEY=? and REGION=? + """), - UPDATE_LAST_RELEASED_SEQUENCE("UPDATE %PREFIX%MESSAGE_GROUP set UPDATED_DATE=?, LAST_RELEASED_SEQUENCE=? where " + - "GROUP_KEY=? and REGION=?"), + UPDATE_LAST_RELEASED_SEQUENCE(""" + UPDATE %PREFIX%MESSAGE_GROUP + set UPDATED_DATE=?, LAST_RELEASED_SEQUENCE=? + where GROUP_KEY=? and REGION=? + """), - DELETE_MESSAGES_FROM_GROUP("DELETE from %PREFIX%MESSAGE where MESSAGE_ID in " + - "(SELECT MESSAGE_ID from %PREFIX%GROUP_TO_MESSAGE where GROUP_KEY = ? and REGION = ?) and REGION = ?"), + DELETE_MESSAGES_FROM_GROUP(""" + DELETE from %PREFIX%MESSAGE + where MESSAGE_ID in (SELECT MESSAGE_ID from %PREFIX%GROUP_TO_MESSAGE where GROUP_KEY = ? and REGION = ?) + and REGION = ? + """), - DELETE_MESSAGE_GROUP("DELETE from %PREFIX%MESSAGE_GROUP where GROUP_KEY=? and REGION=?"), + DELETE_MESSAGE_GROUP(""" + DELETE from %PREFIX%MESSAGE_GROUP + where GROUP_KEY=? and REGION=? + """), - CREATE_GROUP_TO_MESSAGE("INSERT into %PREFIX%GROUP_TO_MESSAGE" + - "(GROUP_KEY, MESSAGE_ID, REGION)" - + " values (?, ?, ?)"), + CREATE_GROUP_TO_MESSAGE(""" + INSERT into %PREFIX%GROUP_TO_MESSAGE (GROUP_KEY, MESSAGE_ID, REGION) + values (?, ?, ?) + """), - UPDATE_GROUP("UPDATE %PREFIX%MESSAGE_GROUP set UPDATED_DATE=? where GROUP_KEY=? and REGION=?"), + UPDATE_GROUP(""" + UPDATE %PREFIX%MESSAGE_GROUP + set UPDATED_DATE=? + where GROUP_KEY=? and REGION=? + """), - LIST_GROUP_KEYS("SELECT distinct GROUP_KEY as CREATED from %PREFIX%MESSAGE_GROUP where REGION=?"); + LIST_GROUP_KEYS(""" + SELECT distinct GROUP_KEY as CREATED + from %PREFIX%MESSAGE_GROUP + where REGION=? + """); private final String sql; diff --git a/spring-integration-redis/src/main/java/org/springframework/integration/redis/util/RedisLockRegistry.java b/spring-integration-redis/src/main/java/org/springframework/integration/redis/util/RedisLockRegistry.java index b510671e4f..2f6e3ecddc 100644 --- a/spring-integration-redis/src/main/java/org/springframework/integration/redis/util/RedisLockRegistry.java +++ b/spring-integration-redis/src/main/java/org/springframework/integration/redis/util/RedisLockRegistry.java @@ -287,16 +287,17 @@ public final class RedisLockRegistry implements ExpirableLockRegistry, Disposabl private abstract class RedisLock implements Lock { - private static final String OBTAIN_LOCK_SCRIPT = - "local lockClientId = redis.call('GET', KEYS[1]) " + - "if lockClientId == ARGV[1] then " + - " redis.call('PEXPIRE', KEYS[1], ARGV[2]) " + - " return true " + - "elseif not lockClientId then " + - " redis.call('SET', KEYS[1], ARGV[1], 'PX', ARGV[2]) " + - " return true " + - "end " + - "return false"; + private static final String OBTAIN_LOCK_SCRIPT = """ + local lockClientId = redis.call('GET', KEYS[1]) + if lockClientId == ARGV[1] then + redis.call('PEXPIRE', KEYS[1], ARGV[2]) + return true + elseif not lockClientId then + redis.call('SET', KEYS[1], ARGV[1], 'PX', ARGV[2]) + return true + end + return false + """; protected static final RedisScript OBTAIN_LOCK_REDIS_SCRIPT = new DefaultRedisScript<>(OBTAIN_LOCK_SCRIPT, Boolean.class); diff --git a/spring-integration-ws/src/test/java/org/springframework/integration/ws/SimpleWebServiceOutboundGatewayTests.java b/spring-integration-ws/src/test/java/org/springframework/integration/ws/SimpleWebServiceOutboundGatewayTests.java index eb99921b96..ed82062960 100644 --- a/spring-integration-ws/src/test/java/org/springframework/integration/ws/SimpleWebServiceOutboundGatewayTests.java +++ b/spring-integration-ws/src/test/java/org/springframework/integration/ws/SimpleWebServiceOutboundGatewayTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,7 +28,7 @@ import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import jakarta.xml.soap.MessageFactory; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.BeanFactory; @@ -60,6 +60,7 @@ import org.springframework.xml.transform.StringResult; import org.springframework.xml.transform.StringSource; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.assertj.core.api.Assertions.fail; import static org.mockito.Mockito.mock; @@ -74,24 +75,26 @@ public class SimpleWebServiceOutboundGatewayTests { private static final String response = "Test Name"; - public static final String responseSoapMessage = - " " + - " " + - response + - " " + - ""; + public static final String responseSoapMessage = """ + + + $response + + + """.replace("$response", response); - public static final String responseEmptyBodySoapMessage = - "\n" + - "\n" + - "\n" + - ""; + public static final String responseEmptyBodySoapMessage = """ + + + + + """; - @Test // INT-1051 + @Test public void soapActionAndCustomCallback() { String uri = "https://www.example.org"; SimpleWebServiceOutboundGateway gateway = new SimpleWebServiceOutboundGateway(new TestDestinationProvider(uri)); - final AtomicReference soapActionFromCallback = new AtomicReference(); + final AtomicReference soapActionFromCallback = new AtomicReference<>(); gateway.setRequestCallback(message -> { SoapMessage soapMessage = (SoapMessage) message; soapActionFromCallback.set(soapMessage.getSoapAction()); @@ -126,13 +129,14 @@ public class SimpleWebServiceOutboundGatewayTests { context.close(); } - @Test(expected = ReplyRequiredException.class) + @Test public void testInt3022EmptyResponseBody() throws Exception { SimpleWebServiceOutboundGateway gateway = new SimpleWebServiceOutboundGateway("http://testInt3022"); gateway.setRequiresReply(true); WebServiceMessageSender messageSender = createMockMessageSender(responseEmptyBodySoapMessage); gateway.setMessageSenders(messageSender); - gateway.handleMessage(new GenericMessage("foo")); + assertThatExceptionOfType(ReplyRequiredException.class) + .isThrownBy(() -> gateway.handleMessage(new GenericMessage<>("foo"))); } @Test @@ -247,8 +251,7 @@ public class SimpleWebServiceOutboundGatewayTests { Mockito.when(messageSender.supports(Mockito.any(URI.class))).thenReturn(true); Mockito.doAnswer(invocation -> { - Object[] args = invocation.getArguments(); - WebServiceMessageFactory factory = (WebServiceMessageFactory) args[0]; + WebServiceMessageFactory factory = invocation.getArgument(0); return factory.createWebServiceMessage(new ByteArrayInputStream(mockResponseMessage.getBytes())); }).when(wsConnection).receive(Mockito.any(WebServiceMessageFactory.class)); diff --git a/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/WebServiceInboundGatewayParserTests-context.xml b/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/WebServiceInboundGatewayParserTests-context.xml index f2c0e133f3..868ae28f53 100644 --- a/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/WebServiceInboundGatewayParserTests-context.xml +++ b/spring-integration-ws/src/test/java/org/springframework/integration/ws/config/WebServiceInboundGatewayParserTests-context.xml @@ -1,9 +1,9 @@ - + - + @@ -42,19 +48,20 @@ + header-mapper="testHeaderMapper"/> - + + reply-timeout="1234"/>