Merge remote-tracking branch 'upstream/master' into 4.0.0-WIP
Conflicts: spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayInterfaceTests.java spring-integration-core/src/test/java/org/springframework/integration/router/config/RouterWithMappingTests.java spring-integration-groovy/src/main/java/org/springframework/integration/groovy/GroovyScriptExecutingMessageProcessor.java spring-integration-http/src/test/java/org/springframework/integration/http/inbound/HttpRequestHandlingMessagingGatewayWithPathMappingTests.java spring-integration-jdbc/src/test/java/org/springframework/integration/jdbc/store/channel/AbstractTxTimeoutMessageStoreTests.java spring-integration-jmx/src/main/java/org/springframework/integration/jmx/OperationInvokingMessageHandler.java Resolved.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2012 the original author or authors.
|
||||
* Copyright 2002-2013 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.
|
||||
@@ -107,9 +107,7 @@ public class JdbcOutboundGateway extends AbstractReplyProducingMessageHandler im
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onInit() {
|
||||
super.onInit();
|
||||
|
||||
protected void doInit() {
|
||||
if (this.maxRowsPerPoll != null) {
|
||||
Assert.notNull(poller, "If you want to set 'maxRowsPerPoll', then you must provide a 'selectQuery'.");
|
||||
poller.setMaxRowsPerPoll(this.maxRowsPerPoll);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2012 the original author or authors.
|
||||
* Copyright 2002-2013 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.
|
||||
@@ -88,8 +88,7 @@ public class StoredProcOutboundGateway extends AbstractReplyProducingMessageHand
|
||||
* when {@link ProcedureParameter} are passed in.
|
||||
*/
|
||||
@Override
|
||||
protected void onInit() {
|
||||
super.onInit();
|
||||
protected void doInit() {
|
||||
};
|
||||
|
||||
@Override
|
||||
|
||||
@@ -31,6 +31,7 @@ import javax.sql.DataSource;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.beans.DirectFieldAccessor;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.core.serializer.Deserializer;
|
||||
@@ -40,12 +41,12 @@ import org.springframework.core.serializer.support.SerializingConverter;
|
||||
import org.springframework.messaging.Message;
|
||||
import org.springframework.messaging.MessageHeaders;
|
||||
import org.springframework.integration.jdbc.JdbcMessageStore;
|
||||
import org.springframework.integration.jdbc.store.channel.ChannelMessageStoreQueryProvider;
|
||||
import org.springframework.integration.jdbc.store.channel.DerbyChannelMessageStoreQueryProvider;
|
||||
import org.springframework.integration.jdbc.store.channel.MessageRowMapper;
|
||||
import org.springframework.integration.jdbc.store.channel.MySqlChannelMessageStoreQueryProvider;
|
||||
import org.springframework.integration.jdbc.store.channel.OracleChannelMessageStoreQueryProvider;
|
||||
import org.springframework.integration.jdbc.store.channel.PostgresChannelMessageStoreQueryProvider;
|
||||
import org.springframework.integration.jdbc.store.channel.ChannelMessageStoreQueryProvider;
|
||||
import org.springframework.integration.store.AbstractMessageGroupStore;
|
||||
import org.springframework.integration.store.MessageGroup;
|
||||
import org.springframework.integration.store.MessageGroupStore;
|
||||
@@ -590,7 +591,9 @@ public class JdbcChannelMessageStore extends AbstractMessageGroupStore implement
|
||||
final Message<?> polledMessage = this.doPollForMessage(key);
|
||||
|
||||
if (polledMessage != null){
|
||||
this.removeMessageFromGroup(groupId, polledMessage);
|
||||
if (!this.doRemoveMessageFromGroup(groupId, polledMessage)) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
return polledMessage;
|
||||
@@ -605,18 +608,26 @@ public class JdbcChannelMessageStore extends AbstractMessageGroupStore implement
|
||||
*/
|
||||
public MessageGroup removeMessageFromGroup(Object groupId, Message<?> messageToRemove) {
|
||||
|
||||
this.doRemoveMessageFromGroup(groupId, messageToRemove);
|
||||
|
||||
return getMessageGroup(groupId);
|
||||
}
|
||||
|
||||
private boolean doRemoveMessageFromGroup(Object groupId, Message<?> messageToRemove) {
|
||||
final UUID id = messageToRemove.getHeaders().getId();
|
||||
|
||||
int updated = jdbcTemplate.update(getQuery(channelMessageStoreQueryProvider.getDeleteMessageQuery()), new Object[] { getKey(id), getKey(groupId), region }, new int[] {
|
||||
Types.VARCHAR, Types.VARCHAR, Types.VARCHAR });
|
||||
|
||||
if (updated != 0) {
|
||||
boolean result = updated != 0;
|
||||
if (result) {
|
||||
logger.debug(String.format("Message with id '%s' was deleted.", id));
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
logger.warn(String.format("Message with id '%s' was not deleted.", id));
|
||||
}
|
||||
|
||||
return getMessageGroup(groupId);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -12,15 +12,14 @@
|
||||
*/
|
||||
package org.springframework.integration.jdbc;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import org.junit.Assert;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.jdbc.core.JdbcOperations;
|
||||
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
|
||||
|
||||
@@ -42,7 +41,7 @@ public class JdbcOutboundGatewayTests {
|
||||
|
||||
try {
|
||||
jdbcOutboundGateway.setMaxRowsPerPoll(10);
|
||||
jdbcOutboundGateway.onInit();
|
||||
jdbcOutboundGateway.afterPropertiesSet();
|
||||
|
||||
} catch (IllegalArgumentException e) {
|
||||
assertEquals("If you want to set 'maxRowsPerPoll', then you must provide a 'selectQuery'.", e.getMessage());
|
||||
|
||||
@@ -12,27 +12,32 @@
|
||||
*/
|
||||
package org.springframework.integration.jdbc.store.channel;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.CompletionService;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.ExecutorCompletionService;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import javax.sql.DataSource;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import org.junit.Assert;
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.junit.Assert;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.integration.jdbc.store.JdbcChannelMessageStore;
|
||||
import org.springframework.integration.support.MessageBuilder;
|
||||
import org.springframework.messaging.Message;
|
||||
import org.springframework.messaging.MessageChannel;
|
||||
import org.springframework.integration.jdbc.store.JdbcChannelMessageStore;
|
||||
import org.springframework.messaging.support.GenericMessage;
|
||||
import org.springframework.integration.support.MessageBuilder;
|
||||
import org.springframework.transaction.PlatformTransactionManager;
|
||||
import org.springframework.transaction.TransactionDefinition;
|
||||
import org.springframework.transaction.TransactionStatus;
|
||||
@@ -62,8 +67,19 @@ abstract class AbstractTxTimeoutMessageStoreTests {
|
||||
protected TestService testService;
|
||||
|
||||
@Autowired
|
||||
@Qualifier("store")
|
||||
protected JdbcChannelMessageStore jdbcChannelMessageStore;
|
||||
|
||||
@Autowired
|
||||
private MessageChannel first;
|
||||
|
||||
@Autowired
|
||||
private CountDownLatch successfulLatch;
|
||||
|
||||
@Autowired
|
||||
private AtomicInteger errorAtomicInteger;
|
||||
|
||||
|
||||
public void test() throws InterruptedException {
|
||||
|
||||
int maxMessages = 10;
|
||||
@@ -141,7 +157,9 @@ abstract class AbstractTxTimeoutMessageStoreTests {
|
||||
return true;
|
||||
}
|
||||
});
|
||||
if (!result) return false;
|
||||
if (!result) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -157,4 +175,14 @@ abstract class AbstractTxTimeoutMessageStoreTests {
|
||||
assertTrue(executorService.awaitTermination(5, TimeUnit.SECONDS));
|
||||
}
|
||||
|
||||
public void testInt3181ConcurrentPolling() throws InterruptedException {
|
||||
for (int i = 0; i < 10; i++) {
|
||||
this.first.send(new GenericMessage<Object>("test"));
|
||||
}
|
||||
|
||||
assertTrue(this.successfulLatch.await(5, TimeUnit.SECONDS));
|
||||
|
||||
assertEquals(0, errorAtomicInteger.get());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ package org.springframework.integration.jdbc.store.channel;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
|
||||
@@ -36,4 +37,10 @@ public class DerbyTxTimeoutMessageStoreTests extends AbstractTxTimeoutMessageSto
|
||||
super.test();
|
||||
}
|
||||
|
||||
@Test
|
||||
@Override
|
||||
public void testInt3181ConcurrentPolling() throws InterruptedException {
|
||||
super.testInt3181ConcurrentPolling();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ import java.util.concurrent.ExecutionException;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
|
||||
@@ -40,4 +41,10 @@ public class HsqlTxTimeoutMessageStoreTests extends AbstractTxTimeoutMessageStor
|
||||
super.testInt2993IdCacheConcurrency();
|
||||
}
|
||||
|
||||
@Test
|
||||
@Override
|
||||
public void testInt3181ConcurrentPolling() throws InterruptedException {
|
||||
super.testInt3181ConcurrentPolling();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ package org.springframework.integration.jdbc.store.channel;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
|
||||
@@ -35,4 +36,10 @@ public class MySqlTxTimeoutMessageStoreTests extends AbstractTxTimeoutMessageSto
|
||||
super.test();
|
||||
}
|
||||
|
||||
@Test
|
||||
@Override
|
||||
public void testInt3181ConcurrentPolling() throws InterruptedException {
|
||||
super.testInt3181ConcurrentPolling();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -54,5 +54,44 @@
|
||||
|
||||
<int:logging-channel-adapter id="loggit" log-full-message="true" level="ERROR"/>
|
||||
|
||||
<task:executor id="threadPoolTaskExecutor" pool-size="100"/>
|
||||
|
||||
<bean id="messageStore" class="org.springframework.integration.jdbc.store.JdbcChannelMessageStore">
|
||||
<property name="dataSource" ref="dataSource"/>
|
||||
<property name="region" value="CONCURRENT_POLL"/>
|
||||
<property name="channelMessageStoreQueryProvider" ref="queryProvider"/>
|
||||
</bean>
|
||||
|
||||
<int:channel id="first">
|
||||
<int:queue message-store="messageStore"/>
|
||||
</int:channel>
|
||||
|
||||
<int:channel id="second">
|
||||
<int:queue message-store="messageStore"/>
|
||||
</int:channel>
|
||||
|
||||
<int:bridge input-channel="first" output-channel="second">
|
||||
<int:poller fixed-rate="200" task-executor="threadPoolTaskExecutor" max-messages-per-poll="3">
|
||||
<int:transactional transaction-manager="transactionManager"/>
|
||||
</int:poller>
|
||||
</int:bridge>
|
||||
|
||||
<bean id="successfulLatch" class="java.util.concurrent.CountDownLatch">
|
||||
<constructor-arg value="10"/>
|
||||
</bean>
|
||||
|
||||
<int:outbound-channel-adapter channel="second" expression="@successfulLatch.countDown()">
|
||||
<int:poller fixed-delay="1000">
|
||||
<int:transactional transaction-manager="transactionManager"/>
|
||||
</int:poller>
|
||||
</int:outbound-channel-adapter>
|
||||
|
||||
<bean id="errorAtomicInteger" class="java.util.concurrent.atomic.AtomicInteger"/>
|
||||
|
||||
<int:service-activator input-channel="errorChannel" output-channel="nullChannel"
|
||||
expression="@errorAtomicInteger.incrementAndGet()">
|
||||
<int:poller fixed-delay="1000"/>
|
||||
</int:service-activator>
|
||||
|
||||
</beans>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user