динамический фильтр интеграции пружины на основе текущей даты - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь использовать ftp-inbound-адаптер для опроса файлов на основе текущей даты. И мой входящий адаптер использует фильтр, который ссылается на bean-фильтр myfilter. Проблема в том, что текущая дата инициализируется при запуске ине был обработан динамически .. Я хотел бы получить текущую дату для каждого нового сообщения

    <int-ftp:inbound-channel-adapter id="ftpInbound"
                    channel="ftpChannel"
                    session-factory="ftpsClientFactory"
                    filter="myFilter"
    </int-ftp:inbound-channel-adapter>

    <bean id="myFilter" class="org.springframework.integration.ftp.filters.FtpRegexPatternFileListFilter" scope="prototype">
        <constructor-arg value="#{T(java.time.LocalDateTime).now().format(T(java.time.format.DateTimeFormatter).ofPattern('MMddyy'))}.(xls|xlsx)"/>
        <aop:scoped-proxy/>
        </bean>

ОБНОВЛЕНИЕ

Я изменил с этого

    <bean id="currentDate" class="java.util.Date" factory-bean="fastDateFormat"
        scope="prototype" factory-method="format" >
        <aop:scoped-proxy/> 
        <constructor-arg>
            <bean class="java.util.Date" />
        </constructor-arg>
    </bean>


<bean id="myFilter" class="org.springframework.integration.ftp.filters.FtpRegexPatternFileListFilter" scope="prototype">
        <constructor-arg value="#{currentDate}.(xls|xlsx)"/>
        </bean>

И мой входящийАдаптер использует фильтр, который ссылается на bean-компонент myFilter. Проблема в том, что текущая дата инициализируется при запуске и не обрабатывается динамически. Я хотел бы получить текущую дату для каждого нового сообщения

1 Ответ

0 голосов
/ 18 декабря 2018

Это невозможно с вашей текущей конфигурацией, потому что filter - это просто singleton бин, созданный только один раз при запуске, потянув, что ваш currentDate для инъекции также только один раз.

Вы можете попробоватьдобавьте <aop:scoped-proxy/> в ваше определение currentDate бина, хотя: https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html#beans-factory-scopes-other-injection,, но я бы посоветовал добавить BeanFactorty в ваш filter и вызывать getBean("currentDate", Date.class) каждый раз, когда вам нужен новый экземпляр этого прототипа.

ОБНОВЛЕНИЕ

Вы вводите BeanFactory в свой filter вместо этого currentDate боба.И затем, когда вызывается логика фильтра, вы делаете Date currentDate = this.beanFactory.getBean("currentDate", Date.class);.

UPDATE2

Вот то, что я думаю, должно работать для вас:

public class DynamicRegexPatternFilter extends AbstractFileListFilter<File> {

    @Autowired
    private BeanFactory beanFactory;

    @Override
    public boolean accept(File file) {
        return Pattern.compile(this.beanFactory.getBean("currentDate", String.class) + ".(xls|xlsx)")
                .matcher(file.getName())
                .matches();
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...