我有一个JDBC:inbound-channel-adapter:设置'max-rows-per-poll'动态来限制在频道上传递的消息。
我有一个容量为200的QueueChannel。入站通道适配器会将消息发送到此QueueChannel。我想根据QueueChannel的RemainingCapacity设置'max-rows-per-poll'值。
为此,我尝试在Bean中注入QueueChannel,但在部署war文件时出现错误。
错误:由于StateConversionError而无法注入QueueChannel。
还有其他方法可以实现这一点。
更新:我使用的是Spring-Integration-2.2.0.RC2
这是jdbc-inbound-adapter的配置:
<si-jdbc:inbound-channel-adapter id ="jdbcInboundAdapter" channel="queueChannel" data-source="myDataSource" auto-startup="true" query="${select.query}"
update="${update.query}" max-rows-per-poll="100" row-mapper="rowMapper" update-per-row="true">
<si:poller fixed-rate="5000">
<si:transactional/>
<si:advice-chain>
<bean class="foo.bar.InboundAdapterPollingConfigurationImpl"/>
</si:advice-chain>
</si:poller>
</si-jdbc:inbound-channel-adapter>
豆:
@Service
public class InboundAdapterPollingConfigurationImpl implements InboundAdapterPollingConfiguration{
private static final Logger logger = LoggerFactory.getLogger(InboundAdapterPollingConfigurationImpl.class);
@Autowired
QueueChannel queueChannel;
@Autowired
SourcePollingChannelAdapter jdbcInboundAdapter;
public void setJdbcInboundAdapterMaxRowsPerPoll(){
String size = String.valueOf(queueChannel.getRemainingCapacity());
DirectFieldAccessor directFieldAccessor = new DirectFieldAccessor(jdbcInboundAdapter);
directFieldAccessor.setPropertyValue("setMaxRowsPerPoll", size);
String maxRowsPerPollSize = (String)directFieldAccessor.getPropertyValue("setMaxRowsPerPoll");
System.out.println(maxRowsPerPollSize);
}
}
问题是如何从建议链中调用InboundAdapterPollingConfigurationImpl.setJdbcInboundAdapterMaxRowsPerPoll()方法。抱歉天真的问题但是我第一次使用建议链。我也在寻找一个例子,但还不幸运。
UPDATE2: 执行此操作时出现以下错误:
JdbcPollingChannelAdapter source = (JdbcPollingChannelAdapter)dfa.getPropertyValue("source");
错误:
java.lang.ClassCastException: $Proxy547 cannot be cast to org.springframework.integration.jdbc.JdbcPollingChannelAdapter –
我有JDK1.6_26。我在其中一篇文章中读到了JDK1.6早期版本中发生的这种情况。
答案 0 :(得分:0)
好吧,让我们试着调查吧!
max-rows-per-poll
是JdbcPollingChannelAdapter
的易失性属性,具有适当的setter。 JdbcPollingChannelAdapter
而言receive()
方法中的内容只是在TaskScheduler.schedule()
的倡议下,看起来在运行时更改该属性是安全的。这是我们任务的第一点QueueChannel
拥有财产getQueueSize()
。至于capacity
是您的配置选项,因此您只需计算max-rows-per-poll
max-rows-per-poll
的价值感兴趣。因此,我们应该以某种方式进入轮询或轮询任务。好吧,<poller>
有advice-chain
个子元素,我们可以编写一些Advice
,在调用JdbcPollingChannelAdapter#setMaxRowsPerPoll
之前应该更改receive()
,并且值应该基于{ {1}} QueueChannel#getQueueSize()
注入QueueChannel
现在有一点不好点:如何注入Advice
bean?我们提供了一个钩子来注册JdbcPollingChannelAdapter
作为bean只是自Spring Integration 3.0以来。从这里开始编写这段代码就足够了:
@Autowired @Qualifier( “jdbcAdapter.source”) private JdbcPollingChannelAdapter messageSource;
本周我们将发布3.0.GA。所以,让我不要在Sring Integration 3.0之前考虑反射'forest'。但是,您可以在注入的MessageSources
bean上使用DirectFieldAccessor
来执行此操作。
更新
您的SourcePollingChannelAdapter
可能如下所示:
Advice
理论在这里:http://docs.spring.io/spring/docs/3.2.5.RELEASE/spring-framework-reference/htmlsingle/#aop