【问题标题】:Ignite Spring Integration seems broken with 2.4 (upgrading from 2.3)Ignite Spring Integration 似乎被 2.4 破坏了(从 2.3 升级)
【发布时间】:2018-11-04 03:22:15
【问题描述】:

我们正在从 2.3 升级到 2.4,并意识到在其 javadoc 中添加的这一行中引用的 IgniteSpringBean 中所做的更改导致我们将 PostConstruct 中的大量引用移动到 handleContextRefresh。

A note should be taken that Ignite instance is started after all other Spring beans have been initialized and right before Spring context is refreshed. That implies that it's not valid to reference IgniteSpringBean from any kind of Spring bean init methods like PostConstruct. If it's required to reference IgniteSpringBean for other bean initialization purposes, it should be done from a ContextRefreshedEvent listener method declared in that bean.

但是,这会破坏根据那里的建议配置的 spring 事务配置,我不确定如何解决。基本上,我们在 spring 应用程序 xml 中有以下内容,其中配置了 IgniteSpringBean 和 SpringTransactionManager,它们在 2.3 中工作,但无法使用 2.4 开始引用上述更改(当我的机器突然停机时,我将添加一点异常),

<bean id="igniteSpringBean" class="org.apache.ignite.IgniteSpringBean">
    <property name="configuration">
        <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
            <property name="igniteInstanceName" value="ObjectManagerGrid"/>
            <property name="clientMode" value="true"/>
            ...
            ...
        </bean>
    </property>
</bean>

<!-- Enable Spring transaction abstraction for Ignite transactions -->
<bean id="transactionManager" class="org.apache.ignite.transactions.spring.SpringTransactionManager">
    <property name="igniteInstanceName" value="ObjectManagerGrid"/>
    <property name="transactionConcurrency" value="PESSIMISTIC"/>
</bean>

<!-- Enable annotation-driven transaction configuration/demarcation -->
<tx:annotation-driven/>

关于如何解决这个问题的任何线索?

谢谢!

更新:以下是例外,

ignite-object-manager - [错误] 2018-05-24 18:36:45.133 [main] org.springframework.boot.SpringApplication - 应用程序启动失败 org.springframework.beans.factory.BeanCreationException:在类路径资源 [applicationContext.xml] 中定义名称为“transactionManager”的 bean 创建错误:调用 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个常用框架

【问题讨论】:

  • 我可以做的一件事是将 SpringTransactionManager bean 实例创建移动到 @Bean 方法中,一旦我拿回我的机器,我将测试这样做......但我希望我没有必须改变任何东西..
  • 移动到 @Bean 方法也不起作用,在启动时低于异常,...... 引起:org.apache.ignite.IgniteIllegalStateException:Ignite instance with provided name doesn't存在。您是否调用 Ignition.start(..) 来启动 Ignite 实例? [name=ObjectManagerGrid] 在 org.apache.ignite.Ignition.ignite(Ignition.java:530) 在 org.apache.ignite.transactions 的 org.apache.ignite.internal.IgnitionEx.grid(IgnitionEx.java:1376)。 spring.SpringTransactionManager.afterPropertiesSet(SpringTransactionManager.java:357)

标签: spring spring-boot spring-data ignite gridgain


【解决方案1】:

它没有损坏,而是在IGNITE-6555 中修复。

不幸的是,这也意味着您现在必须找到一种方法来推迟 SpringTransactionManager 的创建/初始化。

有关该问题的更多详细信息,请访问user list

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多