diff --git a/src/main/java/io/spring/issuebot/RepositoryMonitor.java b/src/main/java/io/spring/issuebot/RepositoryMonitor.java index 6d39058..4441d82 100644 --- a/src/main/java/io/spring/issuebot/RepositoryMonitor.java +++ b/src/main/java/io/spring/issuebot/RepositoryMonitor.java @@ -52,15 +52,26 @@ class RepositoryMonitor { void monitor() { log.info("Monitoring {}/{}", this.repository.getOrganization(), this.repository.getName()); - Page 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 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()); diff --git a/src/test/java/io/spring/issuebot/RepositoryMonitorTests.java b/src/test/java/io/spring/issuebot/RepositoryMonitorTests.java index 1e62dc6..d92ac7a 100644 --- a/src/test/java/io/spring/issuebot/RepositoryMonitorTests.java +++ b/src/test/java/io/spring/issuebot/RepositoryMonitorTests.java @@ -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 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(); + } + }