【发布时间】:2016-09-16 03:49:13
【问题描述】:
为了学习 Spring 集成,我一直在尝试创建一个简单、弹性的日志处理器。我也想坚持使用 java 配置方法。
我在翻译现有 XML 配置时遇到了困难,主要是因为我对 spring 太陌生了。
在a question on the spring forumsGary Russell 中提出了一个类似的解决方案,使用发布-订阅 + JMS 模型和简单的 XML 配置。
我一直在尝试将他的建议转换为 Java 配置,但被卡住了。也就是说,我不确定用于出站通道适配器、服务激活器或如何正确设置消息顺序的正确实体。
这是 Gary 的 XML 配置:
<int-file:inbound-channel-adapter id="dispatcher"
directory="spool"
channel="fileChannel">
<int:poller fixed-delay="2000">
<int:transactional/>
</int:poller>
</int-file:inbound-channel-adapter>
<int:channel id="fileChannel" />
<int-file:file-to-string-transformer input-channel="fileChannel" output-channel="dispatchChannel" />
<int:publish-subscribe-channel id="dispatchChannel" />
<int-jms:outbound-channel-adapter id="dispatcherJms" channel="dispatchChannel" order="1"
connection-factory="connectionFactory"
destination="dispatcher.queue" />
<!-- If JMS Send was successful, remove the file (within the transaction)-->
<int:service-activator input-channel="dispatchChannel" order="2"
output-channel="nullChannel"
expression="headers.file_originalFile.delete()">
<bean id="transactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="connectionFactory"/>
</bean>
更新
根据下面的 cmets,我更新了 java 配置。
但是我仍然收到错误,很可能不了解实体之间的流程和连接,但原始问题已得到解答。
@Bean
@Transactional
@InboundChannelAdapter(channel = "dispatchChannel", poller = @Poller(fixedDelay = "2000"))
public MessageSource<?> dispatcher() {
CompositeFileListFilter<File> filters = new CompositeFileListFilter<>();
filters.addFilter(new SimplePatternFileListFilter(sourceFilenamePattern));
//filters.addFilter(persistentFilter());
FileReadingMessageSource source = new FileReadingMessageSource();
source.setAutoCreateDirectory(true);
source.setDirectory(new File(sourceDirectory));
source.setFilter(filters);
return source;
}
@Bean
public MessageChannel fileChannel() {
return new DirectChannel();
}
@Bean
public PublishSubscribeChannel dispatchChannel() {
return new PublishSubscribeChannel();
}
@Autowired
JmsTemplate jmsTemplate;
@Autowired
ConnectionFactory connectionFactory;
@Bean
@Order(1)
@ServiceActivator(inputChannel = "dispatchChannel")
public MessageHandler dispatcherJmsOutboundChannelAdapter(Message<File> message) {
JmsSendingMessageHandler handler = new JmsSendingMessageHandler(jmsTemplate);
handler.setDestinationName("dispatcher.queue");
return handler;
}
@Bean
@Order(2)
@ServiceActivator(inputChannel = "dispatchChannel")
public void removeFile(Message<?> message) {
//message.getHeaders().get(FileHeaders.ORIGINAL_FILE, File.class).delete();
log.info("delete");
}
@Bean
public JmsTransactionManager transactionManager(ConnectionFactory connectionFactory) {
return new JmsTransactionManager(connectionFactory);
}
我正在使用 spring boot 和几个启动组件,例如 activemq。我已经为 JmsListenerContainerFactory 和 @JmsListener 添加了 @Bean,尽管我不确定这些是否真的有必要。
在将@EnableJms 添加到我的配置文件以及@Autowiring jmstemplate 和connectionfactory 之前,我无法运行任何东西。
运行时,我现在收到的错误是:
org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [org.springframework.messaging.Message] found for dependency
[org.springframework.messaging.Message<?>]:
expected at least 1 bean which qualifies as autowire candidate for this dependency.
Dependency annotations: {}
【问题讨论】: