Я пытаюсь реализовать опрос файлов интеграции Spring, при котором несколько серверов независимо читают из общего каталога и обрабатывают файл. Каждый из них после обработки файла переименовывает его в .DONE, чтобы другой его не выбирал. Наблюдая за тем, как некоторые файлы выбираются обоими, я использовал nioLocker, как в примере ниже. Но похоже, что случайно это не сработает. Сообщите мне, что нужно сделать, чтобы сделать nioLocker надежным в многосерверной среде. По другим причинам наличие отдельного посредника (например, zookeepr / mongo и т. Д.) Не является вариантом.
Спасибо.
@Bean
public TransactionSynchronizationFactory transactionSynchronizationFactory() {
ExpressionParser parser = new SpelExpressionParser();
ExpressionEvaluatingTransactionSynchronizationProcessor syncProcessor =
new ExpressionEvaluatingTransactionSynchronizationProcessor();
syncProcessor.setAfterCommitExpression(parser.parseExpression("payload.renameTo(new java.io.File(payload.path+'.DONE'))"));
syncProcessor.setAfterRollbackExpression(parser.parseExpression("payload.renameTo(new java.io.File(payload.path+'.DONE'))"));
return new DefaultTransactionSynchronizationFactory(syncProcessor);
}
@Bean
public IntegrationFlow receiveInputFile(@Value("/opt/tomcat/in/test") File in,
@Value(".txt") String pattern,
@Value("${edi.poll.delay.all.edi}") int delay,
@Value("${edi.messages.per.poll.new.order}") int messagesPerPoll) {
//Logging required config for debugging
LOGGER.debug("EDI File pattern :"+pattern);
LOGGER.debug("EDI Delay Seconds :"+delay);
LOGGER.debug("EDI Messages Per Poll :"+messagesPerPoll);
return IntegrationFlows
.from(s -> s.file(in).patternFilter(ServicesConstant.PATTERN_PREFIX + pattern).scanEachPoll(true).nioLocker(),
e -> e.poller(Pollers.fixedDelay(delay).maxMessagesPerPoll(messagesPerPoll)
.transactionSynchronizationFactory(transactionSynchronizationFactory())
.transactional(new PseudoTransactionManager())))
.handle(m -> {
LOGGER.info("Received test file " + m);
LOGGER.info("File path: " +m.getPayload());
LOGGER.info(""+ m.getHeaders().toString());
})
.get();
}