Изменить динамический каталог в файле: адаптер входящего канала

Я новичок в Spring и использую Citrus Framework. Я попытаюсь динамически изменить переменную inbound-channel-adapter destination. Эта переменная находится в файле свойств и постоянно меняется.

В настоящее время я использую AtomicReference и меняю его значение в коде Java.

In context.xml :

    <bean id="targetDir" class="java.util.concurrent.atomic.AtomicReference">
        <constructor-arg value="${output.path.temp}"/>
    </bean>

    <file:inbound-channel-adapter id="fileInboundAdapter" auto-create-directory="false"
        channel="fileChannel" directory="file:@targetDir.get()" auto-startup="false"
        filename-pattern="*.xml">
        <si:poller cron="0 * * * * ?"/>
    </file:inbound-channel-adapter>

И в java-файле:

SourcePollingChannelAdapter fileInboundAdapter = (SourcePollingChannelAdapter)context.getApplicationContext().getBean("fileInboundAdapter");
if (fileInboundAdapter.isRunning()) {
    fileInboundAdapter.stop();

    @SuppressWarnings("unchecked")
    AtomicReference<String> targetDir = (AtomicReference<String>)     
    context.getApplicationContext().getBean("targetDir", AtomicReference.class);
    targetDir.set(strOutPath[0]+"/"+strOutPath[1]+"/"+strOutPath[2]+"/"+strOutPath[3]+"/"); 
    fileInboundAdapter.start();
}

Это решение не работает ... у кого-нибудь есть решения?

Большое спасибо.


person Sancho    schedule 10.02.2015    source источник


Ответы (1)


Это правда. Потому что ваш AtomicReference не влияет на цель directory.

Вы делаете это directory="file:@targetDir.get()". Это совсем не правильно, потому что этот String попытается преобразовать в объект File. Если вы хотите использовать здесь SpEL, это должно быть так:

directory="#{targetDir.get()}"

без префикса file:.

В любом случае это не помогает, потому что этот SpEL оценивается только один раз в applicationContext strtup.

Поскольку вы собираетесь изменить directory во время выполнения, вы должны использовать FileReadingMessageSource.setDirectory из своего сервиса. Что-то вроде этого:

SourcePollingChannelAdapter fileInboundAdapter = (SourcePollingChannelAdapter)context.getApplicationContext().getBean("fileInboundAdapter");
if (fileInboundAdapter.isRunning())
    fileInboundAdapter.stop();

    FileReadingMessageSource source = (FileReadingMessageSource) context.getApplicationContext().getBean("fileInboundAdapter.source");    
    source.setDirectory(new File(strOutPath[0]+"/"+strOutPath[1]+"/"+strOutPath[2]+"/"+strOutPath[3]+"/")); 
    fileInboundAdapter.start();
}

И избавься от этого AtomicReference.

С самого начала вы можете напрямую использовать свойство-заполнитель для атрибута directory.

person Artem Bilan    schedule 10.02.2015