Camel-spring-batch を使用して、ローカル ディレクトリからファイルを読み取り、ftp 経由でリモート ディレクトリにアップロードするための spring-batch ジョブを作成しました。私はチャンクを使って同じことをしています。私の春のバッチジョブ構成は次のようになります:
<bean id="consumerTemplate" class="org.apache.camel.impl.DefaultConsumerTemplate" init-method="start" destroy-method="stop">
<constructor-arg ref="camelContext"/>
</bean>
<bean id="producerTemplate" class="org.apache.camel.impl.DefaultProducerTemplate" scope="step" init-method="start" destroy-method="stop">
<constructor-arg ref="camelContext"/>
</bean>
<bean id="localFileReader" class="com.camel.springbatch.reader.LocalFileReader" scope="step" destroy-method="stop">
<constructor-arg value="file:#{jobParameters['dirPath']}"/>
<constructor-arg ref="consumerTemplate"/>
</bean>
<bean id="ftpFileWriter" class="com.camel.springbatch.writer.FtpFileWriter" scope="step">
<constructor-arg ref="producerTemplate"/>
<constructor-arg value="ftp://#{jobParameters['host']}?username=#{jobParameters['user']}&password=#{jobParameters['password']}"/>
</bean>
ジョブ構成:
<batch:job id="ftpReadWrite">
<batch:step id="readFromLocalWriteToFtp" next="readFromFtpWriteToLocal">
<batch:tasklet>
<batch:chunk reader="localFileReader" writer="ftpFileWriter" commit-interval="5" />
</batch:tasklet>
</batch:step>
そして、私の「Localfilereader」と「ftpFileWriter」は次のようになります。
import org.apache.camel.ConsumerTemplate;
import org.apache.camel.component.spring.batch.support.CamelItemReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LocalFileReader extends CamelItemReader {
private Logger log= LoggerFactory.getLogger(this.getClass());
ConsumerTemplate consumerTemplate;
String endpointUri;
public LocalFileReader(ConsumerTemplate consumerTemplate, String endpointUri) {
super(consumerTemplate, endpointUri);
this.consumerTemplate=consumerTemplate;
this.endpointUri=endpointUri;
}
@Override
public Object read() throws Exception {
Object item = consumerTemplate.receiveBody(endpointUri);
return item;
}
}
「FTPファイルライター」
import org.apache.camel.ProducerTemplate;
import org.apache.camel.component.spring.batch.support.CamelItemWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
public class FtpFileWriter extends CamelItemWriter {
private Logger log= LoggerFactory.getLogger(this.getClass());
ProducerTemplate producerTemplate;
String endpointUri;
public FtpFileWriter(ProducerTemplate producerTemplate, String endpointUri) {
super(producerTemplate, endpointUri);
this.producerTemplate=producerTemplate;
this.endpointUri=endpointUri;
}
@Override
public void write(List items) throws Exception {
System.out.println("************************Writing item to ftp "+items);
for (Object item : items) {
System.out.println("writing item [{}]..."+item);
producerTemplate.sendBody(endpointUri, item);
log.debug("wrote item");
}
}
}
ローカル ディレクトリにファイルが 5 つしかない場合は問題なく動作します。ローカルディレクトリから5つのファイルすべてを読み取り、ライターに送信し、ライターはそれをftpサーバーにコミット間隔= 5として送信します。ローカルディレクトリに6つのファイルがある場合、5つのファイルの最初のチャンクをライターに送信し、残りのファイルの読み取りを開始しますが、今回はファイルが1つしか残っていません。1つのファイルを読み取り、4つのファイルを待機し始め、ライターに送信しません。commit-interval=1 で試してみたところ、6 つのファイルすべてがサーバーに送信され、次のファイルの待機が再開されました。ここでは、すべてのファイルが処理されたらプロセスを停止する必要があります。
この問題を解決するのを手伝ってください...