/* * Copyright 2016-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.integration.file.dsl; import java.io.File; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.core.task.TaskExecutor; import org.springframework.integration.channel.NullChannel; import org.springframework.integration.dsl.MessageProducerSpec; import org.springframework.integration.file.config.FileTailInboundChannelAdapterFactoryBean; import org.springframework.integration.file.tail.FileTailingMessageProducerSupport; import org.springframework.messaging.MessageChannel; import org.springframework.scheduling.TaskScheduler; import org.springframework.util.Assert; /** * A {@link MessageProducerSpec} for file tailing adapters. * * @author Artem Bilan * * @since 5.0 */ public class TailAdapterSpec extends MessageProducerSpec<TailAdapterSpec, FileTailingMessageProducerSupport> { private final FileTailInboundChannelAdapterFactoryBean factoryBean = new FileTailInboundChannelAdapterFactoryBean(); private MessageChannel outputChannel; private MessageChannel errorChannel; TailAdapterSpec() { super(null); this.factoryBean.setBeanFactory(new DefaultListableBeanFactory()); } TailAdapterSpec file(File file) { Assert.notNull(file, "'file' cannot be null"); this.factoryBean.setFile(file); return _this(); } /** * Specify the options string for native {@code tail} command. * @param nativeOptions the nativeOptions. * @return the spec. * @see org.springframework.integration.file.tail.OSDelegatingFileTailingMessageProducer#setOptions(String) */ public TailAdapterSpec nativeOptions(String nativeOptions) { this.factoryBean.setNativeOptions(nativeOptions); return _this(); } /** * This field control the stderr events. * @param enableStatusReader boolean to enable or disable events from stderr. * @return the spec */ public TailAdapterSpec enableStatusReader(boolean enableStatusReader) { this.factoryBean.setEnableStatusReader(enableStatusReader); return _this(); } /** * Specify the idle interval before start sending idle events. * @param idleEventInterval interval in ms for the event idle time. * @return the spec. */ public TailAdapterSpec idleEventInterval(long idleEventInterval) { this.factoryBean.setIdleEventInterval(idleEventInterval); return _this(); } /** * Configure a task executor. Defaults to a * {@link org.springframework.core.task.SimpleAsyncTaskExecutor}. * @param taskExecutor the taskExecutor. * @return the spec. */ public TailAdapterSpec taskExecutor(TaskExecutor taskExecutor) { this.factoryBean.setTaskExecutor(taskExecutor); return _this(); } /** * Set a task scheduler - defaults to the integration 'taskScheduler'. * @param taskScheduler the taskScheduler. * @return the spec. */ public TailAdapterSpec taskScheduler(TaskScheduler taskScheduler) { this.factoryBean.setTaskScheduler(taskScheduler); return _this(); } /** * The delay between checks of the file for new content in milliseconds. * @param delay the delay. * @return the spec. * @see org.springframework.integration.file.tail.ApacheCommonsFileTailingMessageProducer#setPollingDelay(long) */ public TailAdapterSpec delay(long delay) { this.factoryBean.setDelay(delay); return _this(); } /** * The delay in milliseconds between attempts to tail a non-existent file, * or between attempts to execute a process if it fails for any reason. * @param fileDelay the fileDelay. * @return the spec. * @see FileTailingMessageProducerSupport#setTailAttemptsDelay(long) */ public TailAdapterSpec fileDelay(long fileDelay) { this.factoryBean.setFileDelay(fileDelay); return _this(); } /** * If {@code true}, tail from the end of the file, otherwise include all lines from the beginning. * Default {@code true}. * @param end the end. * @return the spec. * @see org.springframework.integration.file.tail.ApacheCommonsFileTailingMessageProducer#setEnd(boolean) */ public TailAdapterSpec end(boolean end) { this.factoryBean.setEnd(end); return _this(); } /** * If {@code true}, close and reopen the file between reading chunks. * Default {@code false}. * @param reopen the reopen. * @return the spec. * @see org.springframework.integration.file.tail.ApacheCommonsFileTailingMessageProducer#setReopen(boolean) */ public TailAdapterSpec reopen(boolean reopen) { this.factoryBean.setReopen(reopen); return _this(); } @Override public TailAdapterSpec id(String id) { this.factoryBean.setBeanName(id); return _this(); } @Override public TailAdapterSpec phase(int phase) { this.factoryBean.setPhase(phase); return _this(); } @Override public TailAdapterSpec autoStartup(boolean autoStartup) { this.factoryBean.setAutoStartup(autoStartup); return _this(); } @Override public TailAdapterSpec outputChannel(MessageChannel outputChannel) { this.outputChannel = outputChannel; return _this(); } @Override public TailAdapterSpec errorChannel(MessageChannel errorChannel) { this.errorChannel = errorChannel; return _this(); } @Override protected FileTailingMessageProducerSupport doGet() { if (this.outputChannel == null) { this.factoryBean.setOutputChannel(new NullChannel()); } FileTailingMessageProducerSupport tailingMessageProducerSupport = null; try { this.factoryBean.afterPropertiesSet(); tailingMessageProducerSupport = this.factoryBean.getObject(); } catch (Exception e) { throw new IllegalStateException(e); } if (this.errorChannel != null) { tailingMessageProducerSupport.setErrorChannel(this.errorChannel); } tailingMessageProducerSupport.setOutputChannel(this.outputChannel); return tailingMessageProducerSupport; } }