SourcePollingChannelAdapter注册bean

时间:2015-07-25 22:35:53

标签: java spring spring-integration

我动态创建SourcePollingChannelAdapter。将新url添加到db后,我创建SourcePollingChannelAdapter的新实例并启动它。 这里代码:

public SourcePollingChannelAdapter getAdapter(RssStream rssStream) throws MalformedURLException {
    String beanIdAdapter = "adapter." + rssStream.getId();
    String beanIdSource = "source." + rssStream.getId();
    SourcePollingChannelAdapter adapter;
    if (context.containsBean(beanIdAdapter)) {
      adapter = (SourcePollingChannelAdapter) context.getBean(beanIdAdapter);
    }
    else {

      URL url = new URL(rssStream.getLink());
      FeedEntryMessageSource source = new FeedEntryMessageSource(url, "news");
      source.setApplicationContext(context);
      source.setBeanName("source");
      source.setBeanFactory(beanFactory);
      source.afterPropertiesSet();

      adapter = new SourcePollingChannelAdapter();
      adapter.setApplicationContext(context);
      adapter.setBeanName(beanIdAdapter);
      adapter.setBeanFactory(beanFactory);
      adapter.setSource(source);
      adapter.setOutputChannel(channel);
      adapter.setTrigger(new PeriodicTrigger(5000));
      adapter.afterPropertiesSet();
    }
    return adapter;
  }

但是,在从db删除url之后,我需要停止并删除SourcePollingChannelAdapter

public void deleteAdapter(int id) {
    final String beanId = "adapter." + id;
    if (context.containsBean(beanId)) {
      SourcePollingChannelAdapter adapter = (SourcePollingChannelAdapter) context.getBean(beanId);
      adapter.stop(new Runnable() {
        @Override
        public void run() {
          BeanDefinitionRegistry beanDefinitionRegistry = (BeanDefinitionRegistry) beanFactory;
          beanDefinitionRegistry.removeBeanDefinition(beanId);
        }
      });
    }
  }

我创建了新的adaptar,启动它并尝试删除。但我得到NoSuchBeanDefinitionException。如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您需要注册bean

if (beanFactory instanceof ConfigurableListableBeanFactory) {
    ((ConfigurableListableBeanFactory) beanFactory).registerSingleton(
        beanIdAdapter, adapter);
}

虽然框架是这样做的,但您并不需要注册源代码(除非您以后还需要访问它)。

修改

但是,该框架并非真正为此活动设计 - 最好将引用保留在您自己的类中。请参阅this note