【发布时间】:2018-11-04 09:27:35
【问题描述】:
我看到在 2.4 中引入的 IgniteSpringBean 中的更改延迟了 ignite 实例启动,直到所有其他 spring bean 被初始化可能已经破坏了 Ignite SpringTransactionManager 导致无法为 Ignite 事务的 Spring 事务抽象配置它。我真的非常需要找到解决此问题的方法。任何想法/建议任何人?
下面是来自IgniteSpringBean java doc 的行 "Ignite 实例是在所有其他 Spring bean 初始化之后和 Spring 上下文刷新之前启动的。这意味着从任何类型的 Spring bean 初始化方法(如 PostConstruct)引用 IgniteSpringBean 是无效的。如果需要要为其他 bean 初始化目的引用 IgniteSpringBean,它应该通过在该 bean 中声明的 ContextRefreshedEvent 侦听器方法来完成。”
问题是,因为 SpringTransactionManager 在 afterPropertiesSet() 调用中实现了 org.springframework.beans.factory.InitializingBean 和 ,spring 调用它尝试查找指定的 igniteInstanceName,但由于实例仅在所有其他 Spring bean 初始化之后才启动,IgniteIllegalStateException 失败,
请参阅下面的堆栈跟踪,
lass]: init 方法调用失败;嵌套异常是类 org.apache.ignite.IgniteIllegalStateException:具有提供名称的 Ignite 实例不存在。您是否调用 Ignition.start(..) 来启动 Ignite 实例? [名称=ObjectManagerGrid] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) 在 org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) 在 org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:314) 在 com.brocade.dcm.Application.main(Application.java:63) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:87) 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:50) 在 org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) 原因:org.apache.ignite.IgniteIllegalStateException:具有提供名称的 Ignite 实例不存在。您是否调用 Ignition.start(..) 来启动 Ignite 实例? [名称=ObjectManagerGrid] 在 org.apache.ignite.internal.IgnitionEx.grid(IgnitionEx.java:1376) 在 org.apache.ignite.Ignition.ignite(Ignition.java:530) 在 org.apache.ignite.transactions.spring.SpringTransactionManager.afterPropertiesSet(SpringTransactionManager.java:357) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ...省略了22个常用框架
谢谢
【问题讨论】:
-
从代码中的一个解决方案是,如果github.com/apache/ignite/blob/master/modules/spring/src/main/… 实现 ApplicationListener
并将当前在 afterPropertiesSet() 方法中的代码移动到 @Override public void onApplicationEvent(ContextRefreshedEvent event) 事情将作为将启动 Ignite 实例? -
实际上我不确定我上面提到的 onApplicationEvent(..) 选项是否适用于在 IgniteSpringBean 中使用 SmartInitializingSingleton ,其中 ignite 实例是从 afterSingletonsInstantiated(..) 回调启动的,“@ Override public void afterSingletonsInstantiated()" 可能是这需要在 SpringTransactionManager 中触发基于自定义 Spring 应用程序事件的处理
-
此问题将在此票解决后得到解决:issues.apache.org/jira/browse/IGNITE-8740
标签: spring spring-boot spring-data ignite gridgain