Skip to content

Commit 37a0c40

Browse files
artembilangaryrussell
authored andcommitted
GH-3271: Close session on error in stream source
Fixes #3271 When exception happens at `.withPayload(session.readRaw(remotePath))` in the `AbstractRemoteFileStreamingMessageSource` we don't close session. The resource leaking happens in the caching session factory * Add `session.close();` into the `catch (IOException e) {` in the `AbstractRemoteFileStreamingMessageSource.doReceive()` to clean up resources properly **Cherry-pick to 5.2.x, 5.1.x & 4.3.x**
1 parent af750e7 commit 37a0c40

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

spring-integration-file/src/main/java/org/springframework/integration/file/remote/AbstractRemoteFileStreamingMessageSource.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ protected Object doReceive() {
216216
this.fileInfoJson ? file.toJson() : file);
217217
}
218218
catch (IOException e) {
219+
session.close();
219220
throw new UncheckedIOException("IOException when retrieving " + remotePath, e);
220221
}
221222
}

spring-integration-file/src/test/java/org/springframework/integration/file/remote/RemoteFileStreamingMessageSourceTests.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,26 @@
1717
package org.springframework.integration.file.remote;
1818

1919
import static org.assertj.core.api.Assertions.assertThat;
20+
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
2021
import static org.mockito.ArgumentMatchers.anyString;
2122
import static org.mockito.Mockito.mock;
2223
import static org.mockito.Mockito.when;
2324

2425
import java.io.IOException;
2526
import java.io.InputStream;
27+
import java.io.UncheckedIOException;
2628
import java.util.Collection;
2729
import java.util.Comparator;
2830
import java.util.List;
2931
import java.util.stream.Collectors;
3032

31-
import org.junit.Test;
33+
import org.junit.jupiter.api.Test;
3234

3335
import org.springframework.beans.factory.BeanFactory;
3436
import org.springframework.integration.file.filters.FileListFilter;
37+
import org.springframework.integration.file.remote.session.CachingSessionFactory;
3538
import org.springframework.integration.file.remote.session.Session;
39+
import org.springframework.integration.file.remote.session.SessionFactory;
3640

3741
/**
3842
* @author Lukas Gemela
@@ -69,6 +73,32 @@ public void filterOutFilesNotAcceptedByFilter() throws IOException {
6973
assertThat(testRemoteFileStreamingMessageSource.doReceive()).isNull();
7074
}
7175

76+
@Test
77+
@SuppressWarnings("unchecked")
78+
public void sessionReturnedToCacheProperlyOnDoReceive() throws IOException {
79+
Session<String> session = mock(Session.class);
80+
when(session.readRaw(anyString())).thenThrow(IOException.class);
81+
when(session.list("remoteDirectory")).thenReturn(new String[] { "file1" });
82+
83+
SessionFactory<String> sessionFactory = mock(SessionFactory.class);
84+
when(sessionFactory.getSession()).thenReturn(session);
85+
86+
CachingSessionFactory<String> cachingSessionFactory = new CachingSessionFactory<>(sessionFactory, 1);
87+
RemoteFileTemplate<String> remoteFileTemplate = new RemoteFileTemplate<>(cachingSessionFactory);
88+
89+
TestRemoteFileStreamingMessageSource testRemoteFileStreamingMessageSource =
90+
new TestRemoteFileStreamingMessageSource(remoteFileTemplate, null);
91+
92+
testRemoteFileStreamingMessageSource.setRemoteDirectory("remoteDirectory");
93+
testRemoteFileStreamingMessageSource.setBeanFactory(mock(BeanFactory.class));
94+
testRemoteFileStreamingMessageSource.start();
95+
96+
assertThatExceptionOfType(UncheckedIOException.class)
97+
.isThrownBy(testRemoteFileStreamingMessageSource::doReceive);
98+
99+
assertThat(cachingSessionFactory.getSession()).isNotNull();
100+
}
101+
72102
static class TestRemoteFileStreamingMessageSource extends AbstractRemoteFileStreamingMessageSource<String> {
73103

74104
TestRemoteFileStreamingMessageSource(RemoteFileTemplate<String> template, Comparator<String> comparator) {

0 commit comments

Comments
 (0)