GH-3017: Expose cancel-idle-interval XML attribute

Fixes https://github.com/spring-projects/spring-integration/issues/3017

* Expose also a `ImapIdleChannelAdapterSpec.cancelIdleInterval()` option
* Deprecate useless `ImapMailInboundChannelAdapterSpec.cancelIdleInterval()`

* Fix language in the Doc
This commit is contained in:
Artem Bilan
2019-08-15 17:55:51 -04:00
committed by Gary Russell
parent 6d0757a08a
commit ca8377da9b
7 changed files with 62 additions and 30 deletions

View File

@@ -102,7 +102,7 @@ public class ImapIdleChannelAdapterParser extends AbstractChannelAdapterParser {
IntegrationNamespaceUtils.setValueIfAttributeDefined(receiverBuilder, element, "embedded-parts-as-bytes");
IntegrationNamespaceUtils.setValueIfAttributeDefined(receiverBuilder, element, "simple-content");
IntegrationNamespaceUtils.setValueIfAttributeDefined(receiverBuilder, element, "auto-close-folder");
IntegrationNamespaceUtils.setValueIfAttributeDefined(receiverBuilder, element, "cancel-idle-interval");
return receiverBuilder.getBeanDefinition();
}
}

View File

@@ -368,6 +368,20 @@ public class ImapIdleChannelAdapterSpec
return this;
}
/**
* How often to recycle the idle task (in case of a silently dropped connection).
* Seconds; default 120 (2 minutes).
* @param interval the interval.
* @return the spec.
* @see ImapMailReceiver#setCancelIdleInterval(long)
* @since 5.2
*/
public ImapIdleChannelAdapterSpec cancelIdleInterval(long interval) {
assertReceiver();
this.receiver.setCancelIdleInterval(interval);
return this;
}
@Override
public Map<Object, String> getComponentsToRegister() {
return this.componentsToRegister;

View File

@@ -24,6 +24,7 @@ import org.springframework.integration.mail.SearchTermStrategy;
*
* @author Gary Russell
* @author Artem Bilan
*
* @since 5.0
*/
public class ImapMailInboundChannelAdapterSpec
@@ -72,12 +73,13 @@ public class ImapMailInboundChannelAdapterSpec
* @return the spec.
* @see ImapMailReceiver#setCancelIdleInterval(long)
* @since 5.0.10
* @deprecated since 5.2: there is no idle task started for polling channel adapter.
*/
@Deprecated
public ImapMailInboundChannelAdapterSpec cancelIdleInterval(long interval) {
assertReceiver();
this.receiver.setCancelIdleInterval(interval);
return this;
}
}

View File

@@ -171,6 +171,14 @@
</xsd:appinfo>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="cancel-idle-interval" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
How often to recycle the idle task (in case of a silently dropped connection).
Seconds; default 120 (2 minutes).
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>

View File

@@ -39,7 +39,8 @@
simple-content="true"
embedded-parts-as-bytes="false"
auto-close-folder="false"
should-delete-messages="true"/>
should-delete-messages="true"
cancel-idle-interval="202"/>
<bean id="mapper" class="org.springframework.integration.mail.support.DefaultMailHeaderMapper" />

View File

@@ -58,25 +58,26 @@ public class ImapIdleChannelAdapterParserTests {
@Autowired
private MessageChannel autoChannel;
@Autowired @Qualifier("autoChannel.adapter")
@Autowired
@Qualifier("autoChannel.adapter")
private ImapIdleChannelAdapter autoChannelAdapter;
@Test
public void simpleAdapter() {
Object adapter = context.getBean("simpleAdapter");
assertThat(adapter.getClass()).isEqualTo(ImapIdleChannelAdapter.class);
assertThat(adapter).isInstanceOf(ImapIdleChannelAdapter.class);
DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
Object channel = context.getBean("channel");
assertThat(adapterAccessor.getPropertyValue("outputChannel")).isSameAs(channel);
assertThat(adapterAccessor.getPropertyValue("autoStartup")).isEqualTo(Boolean.FALSE);
Object receiver = adapterAccessor.getPropertyValue("mailReceiver");
assertThat(receiver.getClass()).isEqualTo(ImapMailReceiver.class);
assertThat(receiver).isInstanceOf(ImapMailReceiver.class);
DirectFieldAccessor receiverAccessor = new DirectFieldAccessor(receiver);
Object url = receiverAccessor.getPropertyValue("url");
assertThat(url).isEqualTo(new URLName("imap:foo"));
Properties properties = (Properties) receiverAccessor.getPropertyValue("javaMailProperties");
// mail.imap(s).peek properties
assertThat(properties.size()).isEqualTo(2);
assertThat(properties).hasSize(2);
assertThat(receiverAccessor.getPropertyValue("shouldDeleteMessages")).isEqualTo(Boolean.TRUE);
assertThat(receiverAccessor.getPropertyValue("shouldMarkMessagesAsRead")).isEqualTo(Boolean.TRUE);
assertThat(adapterAccessor.getPropertyValue("errorChannel")).isNull();
@@ -85,24 +86,25 @@ public class ImapIdleChannelAdapterParserTests {
assertThat(receiverAccessor.getPropertyValue("headerMapper")).isNotNull();
assertThat(receiverAccessor.getPropertyValue("simpleContent")).isEqualTo(Boolean.TRUE);
assertThat(receiverAccessor.getPropertyValue("autoCloseFolder")).isEqualTo(false);
assertThat(receiverAccessor.getPropertyValue("cancelIdleInterval")).isEqualTo(202000L);
}
@Test
public void simpleAdapterWithErrorChannel() {
Object adapter = context.getBean("simpleAdapterWithErrorChannel");
assertThat(adapter.getClass()).isEqualTo(ImapIdleChannelAdapter.class);
assertThat(adapter).isInstanceOf(ImapIdleChannelAdapter.class);
DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
Object channel = context.getBean("channel");
assertThat(adapterAccessor.getPropertyValue("outputChannel")).isSameAs(channel);
assertThat(adapterAccessor.getPropertyValue("autoStartup")).isEqualTo(Boolean.FALSE);
Object receiver = adapterAccessor.getPropertyValue("mailReceiver");
assertThat(receiver.getClass()).isEqualTo(ImapMailReceiver.class);
assertThat(receiver).isInstanceOf(ImapMailReceiver.class);
DirectFieldAccessor receiverAccessor = new DirectFieldAccessor(receiver);
Object url = receiverAccessor.getPropertyValue("url");
assertThat(url).isEqualTo(new URLName("imap:foo"));
Properties properties = (Properties) receiverAccessor.getPropertyValue("javaMailProperties");
// mail.imap(s).peek properties
assertThat(properties.size()).isEqualTo(2);
assertThat(properties).hasSize(2);
assertThat(receiverAccessor.getPropertyValue("shouldDeleteMessages")).isEqualTo(Boolean.TRUE);
assertThat(receiverAccessor.getPropertyValue("shouldMarkMessagesAsRead")).isEqualTo(Boolean.TRUE);
assertThat(adapterAccessor.getPropertyValue("errorChannel")).isSameAs(context.getBean("errorChannel"));
@@ -112,42 +114,42 @@ public class ImapIdleChannelAdapterParserTests {
}
@Test
public void simpleAdapterWithMarkeMessagesAsRead() {
Object adapter = context.getBean("simpleAdapterMarkAsRead");
assertThat(adapter.getClass()).isEqualTo(ImapIdleChannelAdapter.class);
public void simpleAdapterWithMarkMessagesAsRead() {
Object adapter = this.context.getBean("simpleAdapterMarkAsRead");
assertThat(adapter).isInstanceOf(ImapIdleChannelAdapter.class);
DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
Object channel = context.getBean("channel");
Object channel = this.context.getBean("channel");
assertThat(adapterAccessor.getPropertyValue("outputChannel")).isSameAs(channel);
assertThat(adapterAccessor.getPropertyValue("autoStartup")).isEqualTo(Boolean.FALSE);
Object receiver = adapterAccessor.getPropertyValue("mailReceiver");
assertThat(receiver.getClass()).isEqualTo(ImapMailReceiver.class);
assertThat(receiver).isInstanceOf(ImapMailReceiver.class);
DirectFieldAccessor receiverAccessor = new DirectFieldAccessor(receiver);
Object url = receiverAccessor.getPropertyValue("url");
assertThat(url).isEqualTo(new URLName("imap:foo"));
Properties properties = (Properties) receiverAccessor.getPropertyValue("javaMailProperties");
// mail.imap(s).peek properties
assertThat(properties.size()).isEqualTo(2);
assertThat(properties).hasSize(2);
assertThat(receiverAccessor.getPropertyValue("shouldDeleteMessages")).isEqualTo(Boolean.TRUE);
assertThat(receiverAccessor.getPropertyValue("shouldMarkMessagesAsRead")).isEqualTo(Boolean.TRUE);
assertThat(receiverAccessor.getPropertyValue("userFlag")).isEqualTo("flagged");
}
@Test
public void simpleAdapterWithMarkeMessagesAsReadFalse() {
public void simpleAdapterWithMarkMessagesAsReadFalse() {
Object adapter = context.getBean("simpleAdapterMarkAsReadFalse");
assertThat(adapter.getClass()).isEqualTo(ImapIdleChannelAdapter.class);
assertThat(adapter).isInstanceOf(ImapIdleChannelAdapter.class);
DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
Object channel = context.getBean("channel");
assertThat(adapterAccessor.getPropertyValue("outputChannel")).isSameAs(channel);
assertThat(adapterAccessor.getPropertyValue("autoStartup")).isEqualTo(Boolean.FALSE);
Object receiver = adapterAccessor.getPropertyValue("mailReceiver");
assertThat(receiver.getClass()).isEqualTo(ImapMailReceiver.class);
assertThat(receiver).isInstanceOf(ImapMailReceiver.class);
DirectFieldAccessor receiverAccessor = new DirectFieldAccessor(receiver);
Object url = receiverAccessor.getPropertyValue("url");
assertThat(url).isEqualTo(new URLName("imap:foo"));
Properties properties = (Properties) receiverAccessor.getPropertyValue("javaMailProperties");
// mail.imap(s).peek properties
assertThat(properties.size()).isEqualTo(2);
assertThat(properties).hasSize(2);
assertThat(receiverAccessor.getPropertyValue("shouldDeleteMessages")).isEqualTo(Boolean.TRUE);
assertThat(receiverAccessor.getPropertyValue("shouldMarkMessagesAsRead")).isEqualTo(Boolean.FALSE);
}
@@ -155,13 +157,13 @@ public class ImapIdleChannelAdapterParserTests {
@Test
public void customAdapter() {
Object adapter = context.getBean("customAdapter");
assertThat(adapter.getClass()).isEqualTo(ImapIdleChannelAdapter.class);
assertThat(adapter).isInstanceOf(ImapIdleChannelAdapter.class);
DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
Object channel = context.getBean("channel");
assertThat(adapterAccessor.getPropertyValue("outputChannel")).isSameAs(channel);
assertThat(adapterAccessor.getPropertyValue("autoStartup")).isEqualTo(Boolean.FALSE);
Object receiver = adapterAccessor.getPropertyValue("mailReceiver");
assertThat(receiver.getClass()).isEqualTo(ImapMailReceiver.class);
assertThat(receiver).isInstanceOf(ImapMailReceiver.class);
DirectFieldAccessor receiverAccessor = new DirectFieldAccessor(receiver);
Object url = receiverAccessor.getPropertyValue("url");
assertThat(url).isEqualTo(new URLName("imap:foo"));
@@ -180,25 +182,26 @@ public class ImapIdleChannelAdapterParserTests {
@Test
public void transactionalAdapter() {
Object adapter = context.getBean("transactionalAdapter");
assertThat(adapter.getClass()).isEqualTo(ImapIdleChannelAdapter.class);
assertThat(adapter).isInstanceOf(ImapIdleChannelAdapter.class);
DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
Object channel = context.getBean("channel");
assertThat(adapterAccessor.getPropertyValue("outputChannel")).isSameAs(channel);
assertThat(adapterAccessor.getPropertyValue("autoStartup")).isEqualTo(Boolean.FALSE);
Object receiver = adapterAccessor.getPropertyValue("mailReceiver");
assertThat(receiver.getClass()).isEqualTo(ImapMailReceiver.class);
assertThat(receiver).isInstanceOf(ImapMailReceiver.class);
DirectFieldAccessor receiverAccessor = new DirectFieldAccessor(receiver);
Object url = receiverAccessor.getPropertyValue("url");
assertThat(url).isEqualTo(new URLName("imap:foo"));
Properties properties = (Properties) receiverAccessor.getPropertyValue("javaMailProperties");
// mail.imap(s).peek properties
assertThat(properties.size()).isEqualTo(2);
assertThat(properties).hasSize(2);
assertThat(receiverAccessor.getPropertyValue("shouldDeleteMessages")).isEqualTo(Boolean.TRUE);
assertThat(receiverAccessor.getPropertyValue("shouldMarkMessagesAsRead")).isEqualTo(Boolean.TRUE);
assertThat(adapterAccessor.getPropertyValue("errorChannel")).isNull();
assertThat(adapterAccessor.getPropertyValue("sendingTaskExecutor")).isEqualTo(context.getBean("executor"));
assertThat(adapterAccessor.getPropertyValue("adviceChain")).isNotNull();
}
public static class TestSearchTermStrategy implements SearchTermStrategy {
@Override
@@ -207,4 +210,5 @@ public class ImapIdleChannelAdapterParserTests {
}
}
}