Make RepositoryMonitor more robust

This commit is contained in:
Andy Wilkinson
2015-12-08 17:21:01 +00:00
parent 3b2639e2d4
commit 7f847ebb4b
2 changed files with 38 additions and 7 deletions

View File

@@ -52,15 +52,26 @@ class RepositoryMonitor {
void monitor() {
log.info("Monitoring {}/{}", this.repository.getOrganization(),
this.repository.getName());
Page<Issue> page = this.gitHub.getIssues(this.repository.getOrganization(),
this.repository.getName());
while (page != null) {
for (Issue issue : page.getContent()) {
for (IssueListener issueListener : this.issueListeners) {
issueListener.onOpenIssue(issue);
try {
Page<Issue> page = this.gitHub.getIssues(this.repository.getOrganization(),
this.repository.getName());
while (page != null) {
for (Issue issue : page.getContent()) {
for (IssueListener issueListener : this.issueListeners) {
try {
issueListener.onOpenIssue(issue);
}
catch (Exception ex) {
log.warn("Listener '{}' failed when handling issue '{}'",
issueListener, issue, ex);
}
}
}
page = page.next();
}
page = page.next();
}
catch (Exception ex) {
log.warn("A failure occurred during issue monitoring", ex);
}
log.info("Monitoring of {}/{} completed", this.repository.getOrganization(),
this.repository.getName());

View File

@@ -25,6 +25,7 @@ import io.spring.issuebot.github.Issue;
import io.spring.issuebot.github.Page;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.willThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -68,4 +69,23 @@ public class RepositoryMonitorTests {
verify(this.issueListenerTwo).onOpenIssue(issueTwo);
}
@Test
public void exceptionFromAnIssueListenerIsHandledGracefully() {
@SuppressWarnings("unchecked")
Page<Issue> page = mock(Page.class);
Issue issue = new Issue(null, null, null, null, null, null, null, null);
given(page.getContent()).willReturn(Arrays.asList(issue));
given(this.gitHub.getIssues("test", "test")).willReturn(page);
willThrow(new RuntimeException()).given(this.issueListenerOne).onOpenIssue(issue);
this.repositoryMonitor.monitor();
verify(this.issueListenerOne).onOpenIssue(issue);
verify(this.issueListenerTwo).onOpenIssue(issue);
}
@Test
public void exceptionFromGitHubIsHandledGracefully() {
given(this.gitHub.getIssues("test", "test")).willThrow(new RuntimeException());
this.repositoryMonitor.monitor();
}
}