Czy może tak być czy z tą wielką pętlą while trzeba coś zrobić?
Podzielić te części na osobne prywatne metody? ma to sens?
public final class IssueProducerByStatusAndUpdateDate implements IssueProducer {
private static final Logger logger = LoggerFactory.getLogger(IssueProducerByStatusAndUpdateDate.class);
private final MyService service;
private final String projectName;
private final IssueStatus status;
private final LongSupplier timeFun;
private final LocalDateTime startDateTime;
private ConcurrentBuffer<Issue> buffer;
public IssueProducerByStatusAndUpdateDate(MyService service, String projectName,
IssueStatus wantedStatus, LongSupplier timeFun) {
this(service, projectName, wantedStatus, timeFun, new LocalDateTime());
}
public IssueProducerByStatusAndUpdateDate(MyService service, String projectName, IssueStatus status,
LongSupplier timeFun, LocalDateTime startDateTime) {
this.service = service;
this.projectName = projectName;
this.status = status;
this.timeFun = timeFun;
this.startDateTime = startDateTime;
}
@Override
public void run() {
LocalDateTime checkFromTmp = startDateTime;
while (true) {
Iterable<Issue> foundIssues = produce(checkFromTmp);
for (Issue issue : foundIssues) {
checkFromTmp = (getAndUpdateNewCheckDate(issue, checkFromTmp));
try {
buffer.put(issue);
} catch (Exception e) {
String msg = "Adding Issue with key " + issue.getKey() + " failed";
logger.warn(msg, e);
}
}
logger.info("Producer: buffer size:" + buffer.size());
try {
Thread.sleep(timeFun.getAsLong());
} catch (InterruptedException e) {
Thread.interrupted();
String msg = "Issue Producer has been interrupted. Restart app.";
logger.error(msg, e);
throw new JiraStatusChangerException(msg);
}
}
}
@Override
public Iterable<Issue> produce(LocalDateTime checkFromTmp) {
Iterable<Issue> issues = service.findAllIssues(projectName);
return StreamSupport.stream(issues.spliterator(), false)
.filter(i -> i.getStatus().getName().equals(status.name))
.filter(i -> i.getUpdateDate().toLocalDateTime().isAfter(checkFromTmp))
.collect(Collectors.toList());
}
@Override
public void setBuffer(ConcurrentBuffer<Issue> buffer) {
this.buffer = buffer;
}
public Set<Issue> getBufferSnapshot() {
return buffer.getBufferSnapshot();
}
private LocalDateTime getAndUpdateNewCheckDate(Issue issue, LocalDateTime oldDate) {
LocalDateTime issueUpdateDate = issue.getUpdateDate().toLocalDateTime();
return issueUpdateDate.isAfter(oldDate) ? issueUpdateDate : oldDate;
}
}