0

我在我的 Spring Boot 应用程序中使用了第三方包。这个具体。这个包有一个方法可以在应用程序启动时创建一个 bean。仅当此包能够与 nats 服务通信时,才会成功创建 bean。在大多数情况下,这一切都很好。远程服务器可用,bean 已创建,我的 spring boot 应用程序正确启动。

但是在一些边缘情况下,远程 nats 服务器可能无法启动。这会导致我的 spring boot 应用程序无法启动,因为上述函数会抛出BeanCreationException

我怎样才能避免这种情况,即当 nats 服务器未启动时,避免我的 spring 应用程序启动失败?

注意:如果这个 bean(与 nats 服务的连接)不可用,我的 spring 应用程序/业务逻辑可以启动并运行。

具体例外:

org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'natsConnection' defined in class path resource [io/nats/spring/boot/autoconfigure/NatsAutoConfiguration.class]:
Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [io.nats.client.Connection]:
Factory method 'natsConnection' threw exception; nested exception is java.io.IOException: Unable to connect to NATS server.\n\tat org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:655)\n\tat org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:635)\n\tat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1336)\n\tat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1176)\n\tat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:556)\n\tat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516)\n\tat org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324)\n\tat org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)\n\tat org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322)\n\tat org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)\n\tat org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:897)\n\tat org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879)\n\tat 
4

1 回答 1

0

beannatsConnection由自动配置创建并使用@ConditionalOnMissingBean. 此类 bean 在您自己的 bean之后实例化。

您可以创建自己的这种类型的 bean io.nats.client.Connection,并将其注册为natsConnection. 这个bean应该没有自己的逻辑。第一次调用时,它应该通过创建一个工作实例NatsAutoConfiguration.natsConnection(...),然后将所有调用委托给它。

因为@ConditionalOnMissingBean来自 NATS 库的默认 bean 不会被实例化,只会创建您的 bean。

于 2020-12-28T02:37:30.227 回答