gpt4 book ai didi

spring - 如何将spring资源注入(inject)Apache Ignite类?

转载 作者:行者123 更新时间:2023-12-02 11:34:30 28 4
gpt4 key购买 nike

我在将 spring bean 注入(inject)某些 ignite 类时遇到问题。我正在尝试创建这个:客户端 -> Apache Ignite -> Spring-Data -> 数据库也许这是错误的,我不确定。

所以,此时我的类(class)如下所示:应用程序配置

@Configuration
@ComponentScan(basePackages = arrayOf("com.ignite.cache"))
open class AppConfiguration : Serializable {
private val logger: Logger = Logger.getLogger(AppConfiguration::class.java)

@Bean
open fun igniteInstance(): Ignite {
val cfg = IgniteConfiguration()

cfg.igniteInstanceName = "springDataNode"

cfg.isPeerClassLoadingEnabled = true


var clientCache: CacheConfiguration<Long, Client> = CacheConfiguration("ClientCache")
clientCache.apply {
setIndexedTypes(Long::class.java, Client::class.java)
setCacheStoreFactory(FactoryBuilder.factoryOf(ClientStore::class.java))
isReadThrough = true
isWriteThrough = true
}

cfg.setCacheConfiguration(clientCache)

return Ignition.start(cfg)
}
}

数据源配置:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = arrayOf("com.ignite.cache.model.repositories.springdatarepository"))
@EnableIgniteRepositories(basePackages = arrayOf("com.ignite.cache.model.repositories.igniterepository"))
@ComponentScan(basePackages = arrayOf("com.ignite.cache.model"))
open class DataSourceConfiguration : Serializable {

@Bean
open fun entityManagerFactory(): LocalContainerEntityManagerFactoryBean {
var entityManagerFactory: LocalContainerEntityManagerFactoryBean = LocalContainerEntityManagerFactoryBean()

entityManagerFactory.apply {
dataSource = dataSource()
setPackagesToScan("com.ignite.cache.model")

var vendorAdapter: HibernateJpaVendorAdapter = HibernateJpaVendorAdapter()

vendorAdapter.apply {
setGenerateDdl(true)
setShowSql(true)
}

var properties: Properties = Properties()

properties.apply {
put("database.dialet", "org.hibernate.dialect.PostgreSQL95Dialect")
put("database.globally_quoted_identifiers", "false")
put("database.enable_lazy_load_no_trans", "true")
put("database.show_sql", "true")
}

jpaVendorAdapter = vendorAdapter
setJpaProperties(properties)
}

return entityManagerFactory
}

@Bean
open fun dataSource(): DataSource {
var source: ComboPooledDataSource = ComboPooledDataSource()

source.apply {
driverClass = "org.postgresql.Driver"
jdbcUrl = "jdbc:postgresql://localhost:5432/ignite"
user = "postgres"
password = "1111"
acquireIncrement = 5
idleConnectionTestPeriod = 60
maxPoolSize = 20
minPoolSize = 10
initialPoolSize = 10
}

return source
}

@Bean
open fun transactionManager() : PlatformTransactionManager {
var manager: JpaTransactionManager = JpaTransactionManager()

manager.apply {
entityManagerFactory = entityManagerFactory().nativeEntityManagerFactory
}

return manager
}

@Bean
open fun exceptionTranslator(): PersistenceExceptionTranslationPostProcessor = PersistenceExceptionTranslationPostProcessor()
}

实体:

@Entity
@Table(name = "client")
data class Client
(
@Id
@Column(name = "id")
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
var id: Long = 0,
@Column(name = "email", nullable = false, unique = true)
var email: String = "",
@Column(name = "login", nullable = false, unique = true)
var login: String = ""
) : Serializable

存储库:

@RepositoryConfig(cacheName = "ClientCache")
interface IgniteClientRepository : IgniteRepository<Client, Long> {
}
@Repository
interface ClientRepository : CrudRepository<Client, Long>

服务类和 ignite CacheStore 的标准实现:

public class ClientStore implements CacheStore<Long, Client>, Serializable {
private Logger logger = Logger.getLogger(ClientStore.class);

@SpringResource
private IClientService clientRepository; // <- error is here (NPE)

@Override
public void loadCache(IgniteBiInClosure<Long, Client> igniteBiInClosure, @Nullable Object... objects) throws CacheLoaderException {
Iterable<Client> clients = clientRepository.findAll();

for(Client client : clients) {
igniteBiInClosure.apply(client.getId(), client);
}
}
...
}

主要:

public class Main {
private static Logger logger = Logger.getLogger(Main.class);

public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfiguration.class, DataSourceConfiguration.class);
Ignite ignite = context.getBean(Ignite.class);

(ignite.getOrCreateCache("ClientCache")).loadCache(null);

IgniteClientRepository clientRepository = context.getBean(IgniteClientRepository.class);

Iterable<Client> clients = clientRepository.findAll();
for(Client client : clients) {
logger.info(client);
}

logger.info("Finish");
}
}

但是当我尝试将一些数据从数据库加载到缓存中时,我收到错误 NPE:

Exception in thread "main" javax.cache.integration.CacheLoaderException: java.lang.NullPointerException
at org.apache.ignite.internal.processors.cache.store.GridCacheStoreManagerAdapter.loadCache(GridCacheStoreManagerAdapter.java:528)
at org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheAdapter.localLoadCache(GridDhtCacheAdapter.java:486)
at org.apache.ignite.internal.processors.cache.GridCacheProxyImpl.localLoadCache(GridCacheProxyImpl.java:217)
at org.apache.ignite.internal.processors.cache.GridCacheAdapter$LoadCacheJob.localExecute(GridCacheAdapter.java:5439)
at org.apache.ignite.internal.processors.cache.GridCacheAdapter$LoadCacheJobV2.localExecute(GridCacheAdapter.java:5488)
at org.apache.ignite.internal.processors.cache.GridCacheAdapter$TopologyVersionAwareJob.execute(GridCacheAdapter.java:6103)
at org.apache.ignite.compute.ComputeJobAdapter.call(ComputeJobAdapter.java:132)
at org.apache.ignite.internal.processors.closure.GridClosureProcessor$C2.execute(GridClosureProcessor.java:1842)
at org.apache.ignite.internal.processors.job.GridJobWorker$2.call(GridJobWorker.java:566)
at org.apache.ignite.internal.util.IgniteUtils.wrapThreadLoader(IgniteUtils.java:6621)
at org.apache.ignite.internal.processors.job.GridJobWorker.execute0(GridJobWorker.java:560)
at org.apache.ignite.internal.processors.job.GridJobWorker.body(GridJobWorker.java:489)
at org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:110)
at org.apache.ignite.internal.processors.job.GridJobProcessor.processJobExecuteRequest(GridJobProcessor.java:1114)
at org.apache.ignite.internal.processors.task.GridTaskWorker.sendRequest(GridTaskWorker.java:1379)
at org.apache.ignite.internal.processors.task.GridTaskWorker.processMappedJobs(GridTaskWorker.java:640)
at org.apache.ignite.internal.processors.task.GridTaskWorker.body(GridTaskWorker.java:532)
at org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:110)
at org.apache.ignite.internal.processors.task.GridTaskProcessor.startTask(GridTaskProcessor.java:743)
at org.apache.ignite.internal.processors.task.GridTaskProcessor.execute(GridTaskProcessor.java:443)
at org.apache.ignite.internal.processors.closure.GridClosureProcessor.callAsync(GridClosureProcessor.java:447)
at org.apache.ignite.internal.processors.closure.GridClosureProcessor.callAsync(GridClosureProcessor.java:418)
at org.apache.ignite.internal.processors.closure.GridClosureProcessor.callAsync(GridClosureProcessor.java:402)
at org.apache.ignite.internal.processors.cache.GridCacheAdapter.globalLoadCacheAsync(GridCacheAdapter.java:3681)
at org.apache.ignite.internal.processors.cache.GridCacheAdapter.globalLoadCache(GridCacheAdapter.java:3657)
at org.apache.ignite.internal.processors.cache.IgniteCacheProxy.loadCache(IgniteCacheProxy.java:387)
at com.ignite.cache.Main.main(Main.java:22)
Caused by: java.lang.NullPointerException
at com.ignite.cache.model.service.ClientStore.loadCache(ClientStore.java:30)
at org.apache.ignite.internal.processors.cache.store.GridCacheStoreManagerAdapter.loadCache(GridCacheStoreManagerAdapter.java:502)
... 26 more

我仍然不明白为什么我的客户端服务没有注入(inject) CacheStore 类。也许我应该使用 xml 配置而不是 java 类配置来点燃?

最佳答案

当您使用 Ignition#startIgniteConfiguration 对象启动 Ignite 时,它​​根本不知道 Spring 上下文。您需要使用 IgniteSpring#start 方法来显式提供上下文。另一种选择是利用 IgniteSpringBean已经实现了 ApplicationContextAware 并正确启动了 Ignite 实例。

另请注意,您需要提供 bean 名称或 bean 类作为 @SpringResource 注释的参数。

关于spring - 如何将spring资源注入(inject)Apache Ignite类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45269537/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com