首页 文章

IgniteSpringBean和Ignite SpringTransactionManager在2.4中不再一起工作

提问于
浏览
0

我看到,在IgniteSpringBean中2.4中引入了一个更改以延迟点燃实例启动,直到所有其他spring bean初始化可能已经破坏Ignite SpringTransactionManager导致无法为Ignite事务的Spring事务抽象配置它 . 我真的非常需要找到解决这个问题的方法 . 任何想法/建议任何人?

下面是来自IgniteSpringBean java doc的行“在初始化所有其他Spring bean之后以及刷新Spring上下文之前启动Ignite实例 . 这意味着从任何类型的Spring bean init方法(如PostConstruct)引用IgniteSpringBean是无效的 . 它需要引用IgniteSpringBean用于其他bean初始化目的,它应该从该bean中声明的ContextRefreshedEvent侦听器方法完成 . “

problem is 自SpringTransactionManager实现了org.springframework.beans.factory.InitializingBean& in the afterPropertiesSet() call that spring calls it tries to look for the igniteInstanceName that's specified but since the instance is started only AFTER 所有其他Spring bean都已初始化, it fails with IgniteIllegalStateException

请看下面的堆栈跟踪,

lass]:调用init方法失败;嵌套异常是类org.apache.ignite.IgniteIllegalStateException:不存在具有提供名称的Ignite实例 . 你有没有调用Ignition.start(..)来启动一个Ignite实例?位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)的org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)的[name = ObjectManagerGrid] . springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:306)at org.springframework.beans.factory.support .DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java) :197)org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFac) tory.java:761)atg.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)位于org.springframework.boot上的org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) .context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)位于org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737)的org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370)at org.springframework.boot.SpringApplication.run(SpringApplication.java:314)位于sun.reflect的sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)的com.brocade.dcm.Application.main(Application.java:63) . NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)位于org.springframework.bo的java.lang.reflect.Method.invoke(Method.java:498)的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ot.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) Caused by: org.apache.ignite.IgniteIllegalStateException: Ignite instance with provided name doesn't exist. Did you call Ignition.start(..) to start an Ignite instance? [name=ObjectManagerGrid] at org.apache.ignite.internal.IgnitionEx.grid(IgnitionEx.java:1376) at org.apache.ignite.Ignition.ignite(Ignition.java:530) at org.apache.ignite.transactions.spring.SpringTransactionManager.afterPropertiesSet(SpringTransactionManager.java:357) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ...省略了22个常用帧

谢谢

1 回答

  • 0

    对于面临此问题的其他人,正如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;
        }
    
    }
    

相关问题