IgniteSpringBean и Ignite SpringTransactionManager больше не работают вместе в версии 2.4 - PullRequest
0 голосов
/ 25 мая 2018

Я вижу, что с изменением, введенным в 2.4 в IgniteSpringBean, для задержки запуска экземпляра ignite до инициализации всех других bean-компонентов Spring, возможно, произошел сбой Ignite SpringTransactionManager , что привело к невозможности настроить его для абстракции транзакции Spring транзакций Ignite,Мне действительно очень нужно найти способ обойти это.Любые идеи / предложения кто-нибудь?

Ниже строка из IgniteSpringBean java doc "Экземпляр Ignite запускается после того, как все другие бины Spring были инициализированы и прямо перед контекстом SpringЭто означает, что недопустимо ссылаться на IgniteSpringBean из любых методов инициализации bean-компонента Spring, таких как PostConstruct. Если требуется ссылаться на IgniteSpringBean для других целей инициализации бина, это следует делать из метода прослушивателя ContextRefreshedEvent, объявленного в этом бине. "

Проблема в , поскольку SpringTransactionManager реализует org.springframework.beans.factory.InitializingBean & в вызове afterPropertiesSet (), который Spring вызывает для его поиска.для указанного значения igniteInstanceName, но поскольку экземпляр запускается только ПОСЛЕ , все остальные компоненты Spring были инициализированы, происходит сбой с 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) в орг.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:483) в org.springframeworkwork.beans.factory.support..DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:230) в org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:302).: 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.me.context.embedded.EmbeddedWebApplicationContext.refresh (EmbeddedWebApplicationContext.java:122) в org.springframework.boot.SpringApplication.refresh (SpringApplication.java:737) в org.springframework.boot.Savaorg.springframework.boot.SpringApplication.run (SpringApplication.java:314) в com.brocade.dcm.Application.main (Application.java:63) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.rag.rag.ragot.loader.MainMethodRunner.run (MainMethodRunner.java:48) в org.springframework.boot.loader.Launcher.launch (Launcher.java:87) в org.springframework.boot.loader.Launcher.launch (Лаунчер.java (Launcher.junch50) в org.springframework.boot.loader.JarLauncher.main (JarLauncher.java:51) Причина: org.apache.ignite.IgniteIllegalStateException: экземпляр Ignite с указанным именем не существует.Вы вызывали Ignition.start (..), чтобы запустить экземпляр Ignite?[name = 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 общих кадра опущены

Спасибо

1 Ответ

0 голосов
/ 29 июня 2018

Для других, сталкивающихся с этой проблемой, как прокомментировал Деннис (@dmagda), это было исправлено с этим билетом, https://issues.apache.org/jira/browse/IGNITE-8740 & будет доступно в 2.6.

Между тем, что я сделалобойти это значит взломать инъекцию таким образом в компоненте конфигурации (@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;
    }

}
...