【问题标题】:Is it best practice to design Spring Application in such a way that we need to create same context multiple times?以我们需要多次创建相同上下文的方式设计 Spring 应用程序是否是最佳实践?
【发布时间】:2016-09-25 19:23:25
【问题描述】:

我将使用 Spring 框架开始一个新项目。由于我在春季没有太多经验,因此我需要您的帮助来解决一些困惑。

让我们看看用例

我的应用程序使用 Spring 集成框架。我的应用程序的核心功能是,

  1. 我需要从文件系统轮询多个目录,
  2. 读取文件(主要是csv),
  3. 对它们进行一些操作并将它们插入到数据库中。

目前我已经为它设置了 spring 集成流程。其中有inbound-chaneell-adapter 用于轮询,然后文件遍历通道并最后插入数据库。

我的担忧是

  1. 应用程序应该轮询的目录数量将在运行时决定。因此我需要在运行时创建inbound-chanell-adapter(因为一个 chanell 适配器一次只能轮询一个目录)并且不能在我的 spring context xml 中静态定义它们(因为我不知道我需要多少)。

  2. 每个目录都有特定的属性,这些属性应该在处理时应用于文件。(通过集成流程时)

  3. 所以现在我正在为每个目录加载new ClassPathXmlApplicationContext("/applicationContext.xml");。并在新创建的上下文中缓存所需的属性。并在处理时使用它们(<int:service-activator>)。

当前设计的缺点

  1. 为每个目录创建单独的上下文。
  2. 复制了不必要的 bean。 (数据库会话工厂等)

那么有没有办法以不重复上下文的方式设计应用程序。而且我仍然可以在整个集成流程中同时使用每个目录的属性???

提前致谢。

【问题讨论】:

  • 只需创建一个工厂,它可以根据需要创建尽可能多的inbound-channel-adapters。永远不要重新创建上下文,因为最终你会遇到奇怪的内存、事务问题等。
  • @MDeinum,是的,我可以为它创建工厂,但仍然不确定我应该如何在整个通道流中传递相应的属性。 ????每个目录都有特定的属性,一些操作应该在消息负载上执行。

标签: java spring design-patterns spring-integration


【解决方案1】:

请参阅dynamic ftp sample 及其自述文件中有关在需要时创建子上下文的链接,其中包含新的入站组件。

另请参阅我对 similar question for multiple IMAP mail adapters using Java configurationfollow-up question 的回答。

您还可以使用消息源建议在每次轮询时重新配置FileReadingMessageSource 以查看不同的目录。见Smart polling

【讨论】:

  • 感谢您的回答。创建父子上下文看起来不错的选择。我会用那个。
猜你喜欢
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 2010-09-05
相关资源
最近更新 更多