【问题标题】:IgniteSpringBean & Ignite SpringTransactionManager do not work together anymore in 2.4IgniteSpringBean 和 Ignite SpringTransactionManager 在 2.4 中不再一起工作
【发布时间】: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


【解决方案1】:

对于其他面临此问题的人,正如 Dennis (@dmagda) 所评论的,此问题已通过此票证修复,https://issues.apache.org/jira/browse/IGNITE-8740 & 将在 2.6 中提供。

与此同时,我解决这个问题的方法是在配置 bean (@Configuration) 中以这种方式破解注入,

/**
 * @author mlekshma
 *
 */
@Configuration
@ComponentScan("com.***.***")
@EnableIgniteRepositories(basePackages={"com.***.***"})
@ImportResource("classpath:ignite-client-conf.xml")
@EnableTransactionManagement
public class IgniteClientConfig {

    private static final Logger LOGGER = LoggerFactory.getLogger(IgniteClientConfig.class);

    public IgniteClientConfig() {
    }

    /**
     * @return
     */
    @Bean
    @DependsOn("igniteInstance")
    @Primary
    @Lazy
    public PlatformTransactionManager transactionManager() {
        final SpringTransactionManager springTransactionManager = new SpringTransactionManager() {
            @Override 
            public void afterPropertiesSet() throws Exception {
                // Do nothing..
            }

            /**
             * @param event
             */
            @EventListener
            public void handleContextRefresh(final ContextRefreshedEvent event) throws Exception {
                LOGGER.info("Setting up tx support..");
                super.afterPropertiesSet();
            }
        };
        // Use default grid client instance created..
        springTransactionManager.setTransactionConcurrency(TransactionConcurrency.PESSIMISTIC);
        return springTransactionManager;
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2019-07-26
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多