2015-02-03 9 views
5
existiert

Ich habe eine Feder Batch-Anwendung, die die Eigenschaftendatei batch-default.properties einrichten alsSpring Batch Quellverzeichnis [target/config] nicht

batch.job.configuration.file.dir = Ziel hat/

Config

Nun ist diese Anwendung funktioniert gut auf meinem lokalen Rechner, obwohl ich habe kein solches Verzeichnis, aber wenn ich versuche, das gleiche auf meiner Integration Server zu implementieren ich erhalte die Fehlermeldung:

Cannot resolve reference to bean 'org.springframework.integration.config.SourcePollingChannelAdapterFactoryBean#0.source' while setting bean property 'source'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.integration.config.SourcePollingChannelAdapterFactoryBean#0.source': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Source directory [target/config] does not exist. 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:334) 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1417) 

Hat jemand Haben Sie ein ähnliches Problem?

Jede Hilfe hier geschätzt.

-Vaibhav

+0

Ich habe versucht, die Datei "batch.job.configuration.file.dir" in ein Verzeichnis auf dem lokalen Rechner zu setzen sogar zur Verzeichnisstruktur im Klassenpfad, aber es hat nicht geholfen – vaibhav

Antwort

6

Wir hatten ein ähnliches Problem auf unserem Test-Server. Sieht aus wie ein Problem mit Dateiberechtigungen, d. H. Spring Batch Admin versucht, eine Verzeichnisstruktur für "target/config" zu erstellen, aber der Benutzer darf die Verzeichnisse nicht erstellen.

Dies ist die Kette das Problem verursacht:

META-INF/spring/batch/bootstrap/integration/configuration-context.xml enthält die Definition eines verweisenden Datei poller auf die Eigenschaft:

<file:inbound-channel-adapter directory="${batch.job.configuration.file.dir}" channel="job-configuration-files" 
     filename-pattern=".*\.xml"> 
     <poller max-messages-per-poll="1" cron="5/1 * * * * *" /> 
    </file:inbound-channel-adapter> 

die Dokumentation der Inbound-Kanal-Adapter Überprüfung ergibt folgendes Bild (Feder-Integration-file-2.1.xsd):

<xsd:attribute name="directory" type="xsd:string" use="required"> 
       <xsd:annotation> 
        <xsd:documentation><![CDATA[Specifies the input directory (The directory to poll from) e.g.: 
        directory="file:/absolute/input" or directory="file:relative/input"]]></xsd:documentation> 
       </xsd:annotation>    
      </xsd:attribute> 

und()

0123!
<xsd:attribute name="auto-create-directory" type="xsd:string" default="true"> 
       <xsd:annotation> 
        <xsd:documentation> 
         Specify whether to automatically create the source directory if it does not yet exist when this 
         adapter is being initialized. The default value is 'true'. If set to 'false' and the directory 
         does not exist upon initialization, an Exception will be thrown. 
        </xsd:documentation> 
       </xsd:annotation> 
      </xsd:attribute> 

Als Ergebnis ist auto-create-directory wahr und Spring versucht, die (relative) Verzeichnisstruktur irgendwo auf dem Shell-Pfad Ihres Servers zu erstellen.

Für die Fehlermeldung gibt die Java-Klasse Überprüfung org.springframework.integration.file.FileReadingMessageSource die Erklärung:

if (!this.directory.exists() && this.autoCreateDirectory) { 
      this.directory.mkdirs(); 
     } 
     Assert.isTrue(this.directory.exists(), 
       "Source directory [" + directory + "] does not exist."); 

Die javadoc von java.io.File.mkdirs() sagt:

public boolean mkdirs() 

Creates the directory named by this abstract pathname, including any necessary but nonexistent parent directories. Note that if this operation fails it may have succeeded in creating some of the necessary parent directories. 

Returns: 
    true if and only if the directory was created, along with all necessary parent directories; false otherwise 

Also, was ist passiert, die mkdirs() gibt „false "weil er das Verzeichnis nicht erstellen konnte. Das folgende exists() gibt auch "false" zurück und gibt die Fehlermeldung zurück, die im ursprünglichen Post angegeben wurde.

Sie können umgehen, indem Sie den Parameter auf ein vorhandenes und schreibbares Verzeichnis wie "/ tmp" setzen, indem Sie einen absoluten Pfad verwenden. Leider weiß ich nicht, wie diese Spring-Batch-Funktion funktionieren sollte, wenn Sie Ihre Jobdefinitionen auf einem Klassenpfad speichern. es wäre sinnvoller, keinen Datei-Poller zu verwenden, sondern einen "Klassenpfad-bewussten" Datei-Poller zu verwenden ...