2016-07-21 5 views
0

Wir wurden aufgefordert, Berichtsdateien aus einem Ordner zu indizieren. Wir müssen in Stapeln indexieren, was bedeutet, dass wir nicht indexieren, wenn wir nicht genug Dateien haben. Wir werden jedoch irgendwann indexieren, auch wenn wir nach einer gewissen Zeit nicht genug Dateien haben. Also haben wir diese zwei Bedingungen, die die gleiche Funktion auslösen.Datei-Poller aktiviert, wenn eine Warteschlange voll ist oder eine festgelegte Zeitspanne verstrichen ist

Wir konnten eine Warteschlange, den eingehenden Poller (zum Abrufen von Dateien) und den ausgehenden Poller (zum Indexieren von Dateien nach Ablauf der x-Zeit) richtig konfigurieren. Allerdings konnten wir die Funktion immer noch nicht starten, wenn die Warteschlange voll ist. Und obwohl ich anerkenne, dass wir weit davon entfernt sind, Experten für Spring Integration zu sein, glauben Sie mir, wenn ich sage, dass wir die Dokumentation mehrere Male durchgespielt und endlose Beispielprojekte gesehen haben. Aber das entgeht uns immer noch.

Genug Worte. Hier haben einige Code:

ip-Kunden-Berichte-config:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:int="http://www.springframework.org/schema/integration" 
     xmlns:int-file="http://www.springframework.org/schema/integration/file" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd 
        http://www.springframework.org/schema/integration/file http://www.springframework.org/schema/integration/file/spring-integration-file.xsd"> 

    <bean id="customerReportsFileManager" class="xxx.xxx.xxx.xxx.reports.CustomerReportsFileManager" /> 

    <int:channel id="customerReportInputChannel" /> 

    <int-file:inbound-channel-adapter channel="customerReportInputChannel" directory="${customer.reports.directory}"> 
     <int:poller time-unit="SECONDS" fixed-delay="3" /> 
    </int-file:inbound-channel-adapter> 

    <int:service-activator input-channel="customerReportInputChannel" output-channel="customerReportIndexationInputChannel" 
          ref="customerReportsFileManager" method="prepareFile" /> 

    <int:channel id="customerReportIndexationInputChannel"> 
     <int:queue capacity="3" /> <!-- Capacity -1 --> 
    </int:channel> 

    <int:outbound-channel-adapter channel="customerReportIndexationInputChannel" ref="customerReportsFileManager" method="indexReports"> 
     <int:poller time-unit="SECONDS" fixed-delay="60" /> 
    </int:outbound-channel-adapter> 

</beans> 

CustomerReportsFileManager:

public class CustomerReportsFileManager { 
    private static final Logger LOGGER = LoggerFactory.getLogger(CustomerReportsFileManager.class); 

    public File prepareFile(File file) { 
     LOGGER.warn("[prepareFile] " + file.getPath()); 

     return file; 
    } 

    public void indexReports(File file) { 
     LOGGER.warn("[indexReports] " + file.getPath()); 
    } 
} 

Antwort

2

Sie den falschen Ansatz.

Verwenden Sie keine Warteschlange für diese - schreiben Sie einfach eine benutzerdefinierte FileListFilter und injizieren Sie es in den Dateiadapter - der Filter kann eine leere Liste zurückgeben, bis die erforderliche Zeit verstreicht oder die erforderliche Anzahl von Dateien erreicht ist.

+0

Danke. Ich habe es mit dem vorgeschlagenen Ansatz funktioniert. Ich denke, wir waren zu hartnäckig bei dem Versuch, es hauptsächlich auf XML zu codieren. –

Verwandte Themen