Spring application context resource is not injected.

在加载数据的时候,报错

但是再run一次的时候,错误又消失了

[2019-04-18T16:47:46,396][INFO ][main][GridDiscoveryManager] Topology snapshot [ver=8, locNode=be992a42, servers=3, clients=1, state=ACTIVE, CPUs=16, offheap=4.7GB, heap=7.0GB]
[2019-04-18T16:47:46,485][ERROR][exchange-worker-#38%ignite-baodao%][GridCachePartitionExchangeManager] Failed to process custom exchange task: ClientCacheChangeDummyDiscoveryMessage [reqId=24b3fdc4-c1a2-428a-bd00-d654483b5ecf, cachesToClose=null, startCaches=[ty_zyb]]
org.apache.ignite.IgniteException: Spring application context resource is not injected.
    at org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory.create(CacheJdbcPojoStoreFactory.java:171) ~[ignite-core-2.7.0.jar:2.7.0]
    at org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory.create(CacheJdbcPojoStoreFactory.java:100) ~[ignite-core-2.7.0.jar:2.7.0]
    at org.apache.ignite.internal.processors.cache.GridCacheProcessor.createCache(GridCacheProcessor.java:1558) ~[ignite-core-2.7.0.jar:2.7.0]
    at org.apache.ignite.internal.processors.cache.GridCacheProcessor.prepareCacheStart(GridCacheProcessor.java:2146) ~[ignite-core-2.7.0.jar:2.7.0]
    at org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager.processClientCacheStartRequests(CacheAffinitySharedManager.java:438) ~[ignite-core-2.7.0.jar:2.7.0]
    at org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager.processClientCachesChanges(CacheAffinitySharedManager.java:637) ~[ignite-core-2.7.0.jar:2.7.0]
    at org.apache.ignite.internal.processors.cache.GridCacheProcessor.processCustomExchangeTask(GridCacheProcessor.java:391) ~[ignite-core-2.7.0.jar:2.7.0]
    at org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$ExchangeWorker.processCustomTask(GridCachePartitionExchangeManager.java:2475) [ignite-core-2.7.0.jar:2.7.0]
    at org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$ExchangeWorker.body0(GridCachePartitionExchangeManager.java:2620) [ignite-core-2.7.0.jar:2.7.0]
    at org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$ExchangeWorker.body(GridCachePartitionExchangeManager.java:2539) [ignite-core-2.7.0.jar:2.7.0]
    at org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:120) [ignite-core-2.7.0.jar:2.7.0]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_144]
[2019-04-18T16:48:56,032][INFO ][ignite-update-notifier-timer][GridUpdateNotifier] Update status is not available.

参考代码  createCache

 private GridCacheContext createCache(CacheConfiguration<?, ?> cfg,
        CacheGroupContext grp,
        @Nullable CachePluginManager pluginMgr,
        DynamicCacheDescriptor desc,
        AffinityTopologyVersion locStartTopVer,
        CacheObjectContext cacheObjCtx,
        boolean affNode,
        boolean updatesAllowed,
        boolean disabledAfterStart)
        throws IgniteCheckedException {
        assert cfg != null;

        if (cfg.getCacheStoreFactory() instanceof GridCacheLoaderWriterStoreFactory) {
            GridCacheLoaderWriterStoreFactory factory = (GridCacheLoaderWriterStoreFactory)cfg.getCacheStoreFactory();

            prepare(cfg, factory.loaderFactory(), false);
            prepare(cfg, factory.writerFactory(), false);
        }
        else
            prepare(cfg, cfg.getCacheStoreFactory(), false);

        CacheStore cfgStore = cfg.getCacheStoreFactory() != null ? cfg.getCacheStoreFactory().create() : null;
//此处省略后面N行

这个代码是在客户端创建cache,并且会判断cacheStoreFactory

通过debug代码,发现执行到这一块的时候,拿到了server端的已经创建的path,并且这个path是有cacheStoreFactory的

但是我本地的客户端把 jdbcSource给删除掉了,导致无法创建基于数据库的cacheStore

这说明客户端的cache也需要跟服务端一样的cache store配置

检查代码可以发现, 这个报错发生在

if (appCtx == null)
                throw new IgniteException("Spring application context resource is not injected.");

这个不是因为拿不到bean,而且appCtx就没有, 需要寻找这个值是在哪里初始化的?

这个值是通过调用如下方法拿到的

List<DynamicCacheDescriptor> startDescs = clientCachesToStart(msg.requestId(), msg.startRequests());

发现一个奇怪的现象, 初次重启集群,然后直接运行刚才的客户端程序就不报错

有3个步骤, 

第一步:启动集群

第二步:使用jdbc方式创建表插入数据

第三步:使用function方式创建jdbcStore,从数据库load数据

如果按这3步顺序执行是没有问题的, 执行完后,再去执行第二步就报错了.

也就是说jdbcStore创建完成后,再想用客户端调用,也得有jdbcStore的初始化

需要分析一下这种不同的方式会有什么问题?

未完待续

猜你喜欢

转载自blog.csdn.net/gs80140/article/details/89382564