Spring Integration jdbc:inbound-channel-adapter - 将max-rows-per-poll dynamic设置为throttle

时间:2013-12-10 17:25:03

标签: spring-integration

我有一个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早期版本中发生的这种情况。

1 个答案:

答案 0 :(得分:0)

好吧,让我们试着调查吧!

  1. max-rows-per-pollJdbcPollingChannelAdapter的易失性属性,具有适当的setter。
  2. JdbcPollingChannelAdapter而言receive()方法中的内容只是在TaskScheduler.schedule()的倡议下,看起来在运行时更改该属性是安全的。这是我们任务的第一点
  3. QueueChannel拥有财产getQueueSize()。至于capacity是您的配置选项,因此您只需计算max-rows-per-poll
  4. 的值即可
  5. 现在如何让它运作起来?实际上,您对每个民意调查中max-rows-per-poll的价值感兴趣。因此,我们应该以某种方式进入轮询或轮询任务。好吧,<poller>advice-chain个子元素,我们可以编写一些Advice,在调用JdbcPollingChannelAdapter#setMaxRowsPerPoll之前应该更改receive(),并且值应该基于{ {1}}
  6. QueueChannel#getQueueSize()注入QueueChannel
  7. 的bean中
  8. 现在有一点不好点:如何注入Advice bean?我们提供了一个钩子来注册JdbcPollingChannelAdapter作为bean只是自Spring Integration 3.0以来。从这里开始编写这段代码就足够了:

    @Autowired @Qualifier( “jdbcAdapter.source”) private JdbcPollingChannelAdapter messageSource;

  9. 本周我们将发布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