如何在Spring中实现弹性bean?

时间:2011-07-06 07:22:28

标签: java spring

我有一个Spring bean,它在构造函数中通过http访问外部系统。 如果外部系统在启动时不可用,则无法创建bean并且应用程序无法正常启动。

我希望我的应用程序无论外部系统如何都能启动。我宁愿缺少功能一段时间而不是重新启动应用程序。

我知道在Spring中可以通过正确选择范围和代理bean工厂来实现这一点,但我不确定它是如何实现的。在我看来,Spring AOP的大多数部分旨在修改成功创建的目标,并且无法在创建过程中处理激活或我错了吗?

简而言之:我想要一个在第一次访问时创建目标bean的代理,然后只要它工作就保留该实例。如果它无法创建它,它应抛出异常并在下次调用代理时重试。

那么,您将如何实现此功能?

4 个答案:

答案 0 :(得分:1)

你尝试过懒豆启动吗?

<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/>

您不应将此bean设置为Singleton bean的属性,因为它将在启动时启动它。

答案 1 :(得分:1)

我最终创建了一个ResilientBeanProxy,它将实际的创建推迟到以后,所以是的,它几乎就像Spring的惰性初始化,但增加了它在init期间处理异常的功能。例如它不会停止创建应用程序上下文,在启动过程中会发生错误。

如果创建失败,将在下次调用时重试。

答案 2 :(得分:0)

考虑你的bean在施工时间是否真的依赖于远程资源?也许你可以在这里简单地使用 lazy init ?您不会在构造函数中调用此外部系统,而是在需要远程资源时首先调用它的方法。如果资源不在那里,则会发现ResourceUnavailableException有一条消息'Try again later'

答案 3 :(得分:0)

一个旧线程,但是我只是试图遵循类似的模式,在我的情况下,惰性初始化起作用。

只要将Bean 注入点(@Autowire或构造函数参数)都标记为@Lazy,那么直到首次访问该Bean时才会创建。

如果Bean创建失败(引发异常),则访问Bean的组件可以处理该异常。但是,由于没有将Bean实例添加到上下文中(因为创建失败),因此对Bean的下一次访问将尝试再次创建它。

在我的上下文中,这似乎很好用,其中Bean是到远程Web服务的连接,该Web服务的WSDL在启动时可能不可用。