1

Linux で Spring Batch ジョブを実行しています (Windows では正常に動作します)。これは単純なファイルの存在チェックですが、パス/ファイルが確実に存在する場合にシステムにパス/ファイルを見つけることができません。Spring の Resource クラスは、Linux または Windows でいつ実行されるかを自動的に認識しますか? 他にできることはありますか

私の仕事の定義

    <batch:job id="vendorGoalsJob" restartable="true">
            <batch:step id="checkStartFileExists" next="readHeaderFiles">
                <batch:tasklet ref="startFileExistsTasklet" />
            </batch:step>
     more steps....
    </batch:job>

    <bean id="startFileExistsTasklet"
        class="com.blah.blah.StartFileExistsTasklet"
        scope="step">
        <property name="resource" value="/di/global/Users/my filename with blanks.txt" />
    </bean>

タスクレット クラス:

package com.blah.blah;

import static java.lang.String.format;

import org.apache.log4j.Logger;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.core.io.Resource;

public class StartFileExistsTasklet implements Tasklet {

    private static final Logger logger = Logger.getLogger(StartFileExistsTasklet.class);
    private Resource resource; 

    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {

        if (!resource.isReadable()) {
            logger.info(format("Resource %s not found.",  resource.getFilename()));
            chunkContext.getStepContext().getStepExecution().setTerminateOnly();
        }
        return RepeatStatus.FINISHED;
    }

    public void setResource(Resource resource) {
        this.resource = resource;
    }


}

...そして、常に「見つかりません」というメッセージが表示されます。

2013-09-26 15:47:09,342 handleStep Executing step: [checkStartFileExists]                                           (SimpleStepHandler.java:133) 
2013-09-26 15:47:09,352 execute Resource vendor-goal-trigger.txt not found.                                      
2013-09-26 15:47:09,361 isInterrupted Step interrupted through StepExecution   
4

1 に答える 1

2

リソース URL でプロトコルが指定されていない場合、Spring が使用するデフォルトの RessourceLoader はクラスパスからロードされます。

/**
 * Default implementation of the {@link ResourceLoader} interface.
 * Used by {@link ResourceEditor}, and serves as base class for
 * {@link org.springframework.context.support.AbstractApplicationContext}.
 * Can also be used standalone.
 *
 * <p>Will return a {@link UrlResource} if the location value is a URL,
 * and a {@link ClassPathResource} if it is a non-URL path or a
 * "classpath:" pseudo-URL.
 *
 * @author Juergen Hoeller
 * @since 10.03.2004
 * @see FileSystemResourceLoader
 * @see org.springframework.context.support.ClassPathXmlApplicationContext
 */
public class DefaultResourceLoader implements ResourceLoader { ... }

file:次のプレフィックスを使用してみてください。

<property name="resource" value="file:/di/global/Users/my filename with blanks.txt"/>
于 2013-09-30T20:14:13.593 に答える