更改 file:inbound-channel-adapter 上的动态目录
Change dynamical directory on file:inbound-channel-adapter
我是 Spring 的新手,我正在使用 Citrus Framework。
我将尝试动态更改 inbound-channel-adapter
destination
变量。这个变量位于属性文件中,并且一直在变化。
目前我正在使用 AtomicReference
,我在 java 代码中更改了它的值
在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();
}
此解决方案不起作用...有人有任何解决方案吗?
非常感谢。
没错。因为你的 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
属性使用 属性-占位符。
我是 Spring 的新手,我正在使用 Citrus Framework。
我将尝试动态更改 inbound-channel-adapter
destination
变量。这个变量位于属性文件中,并且一直在变化。
目前我正在使用 AtomicReference
,我在 java 代码中更改了它的值
在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();
}
此解决方案不起作用...有人有任何解决方案吗?
非常感谢。
没错。因为你的 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
属性使用 属性-占位符。