[关闭]
@aloxc 2017-12-05T06:22:07.000000Z 字数 4225 阅读 513

关于ignite中资源注入方式

ignite ioc spring di


一般情况下,我们在使用spring做开发的时候,资源注入使用@AutorWired或者@Resource、或者在配置文件中注入。这些都没问题,但是放在ignite中将不能自动正确的注入,可能会注入失败,注入了null对象,大家一起来看下如下代码,

  1. <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="tybbs_user_datasource">
  2. <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
  3. <property name="url" value="jdbc:mysql://192.168.20.185:3306/xefge"></property>
  4. <property name="username" value="root"></property>
  5. <property name="password" value="abcef0pDL2vF"></property>
  6. </bean>
  1. @Component
  2. public class CacheOnlyStoreFactoryExampleUsingMysql extends JdbcDaoSupport implements CacheStore<Long,Person>,BeanFactoryAware,Serializable{
  3. private final static String TABLE_NAME = "ignite_person";
  4. private static final long serialVersionUID = -309306329114471641L;
  5. @SpringResource(resourceName = "tybbs_user_datasource")
  6. private transient DriverManagerDataSource tybbs_user_datasource;
  7. @Autowired
  8. private transient DriverManagerDataSource tybbs_user_datasource1;
  9. @Override
  10. public void loadCache(final IgniteBiInClosure<Long, Person> igniteBiInClosure, @Nullable Object... objects) throws CacheLoaderException {
  11. logger.error("spring配置文件中的数据ds " + (tybbs_user_datasource != null ? tybbs_user_datasource : null));
  12. logger.error("spring配置文件中的数据ds " + (tybbs_user_datasource1 != null ? tybbs_user_datasource1 : null));
  13. logger.error("从数据库加载所有数据");
  14. long start = System.currentTimeMillis();
  15. StringBuffer sql = new StringBuffer();
  16. sql.append("SELECT `id`,");
  17. sql.append("`first_name`, `last_name`");
  18. sql.append(" FROM `").append(TABLE_NAME).append("` WHERE 1 = 1");
  19. sql.append(" ORDER BY `id` DESC");
  20. logger.error("spring jdbc Template 是否为空 " + (this.getJdbcTemplate() == null));
  21. // boolean isDebug = true;
  22. // if(isDebug)throw new CacheLoaderException("aaa");
  23. List<Person> list = this.getJdbcTemplate().query(sql.toString(), new CacheLoadOnlyStoreRowMapper<Person>());
  24. for(Person person : list){
  25. igniteBiInClosure.apply(person.getId(),person);
  26. }
  27. logger.error("从数据库加载所有数据花费" + (System.currentTimeMillis() - start) + "毫秒");
  28. }
  29. }

这段代码不是这个类的完整代码,只为演示,大家自己做测试的时候自己补充完所有代码。
代码里面有两个需要注入的地方,
@SpringResource(resourceName = "tybbs_user_datasource")
private transient DriverManagerDataSource tybbs_user_datasource;
@Autowired
private transient DriverManagerDataSource tybbs_user_datasource1;
客户端运行相关测试这两段代码的时候,有两种情况
1、服务端刚完成启动,客户端还没运行过。这种情况下,客户端第一次执行程序并连接服务端,通过日志可以看到
tybbs_user_datasource和tybbs_user_datasource1返回的同一个实例,
[09:32:20,115][SEVERE][mgmt-#55%null%][CacheOnlyStoreFactoryExampleUsingMysql] spring配置文件中的数据ds org.springframework.jdbc.data
source.DriverManagerDataSource@3f7564bd
[09:32:20,116][SEVERE][mgmt-#55%null%][CacheOnlyStoreFactoryExampleUsingMysql] spring配置文件中的数据ds org.springframework.jdbc.data
source.DriverManagerDataSource@3f7564bd
2、服务端完成启动并且先前已经执行了一次客户端代码。这种情况下ignite服务端会看到如下日志
[09:33:06,295][SEVERE][mgmt-#66%null%][CacheOnlyStoreFactoryExampleUsingMysql] spring配置文件中的数据ds org.springframework.jdbc.data
source.DriverManagerDataSource@3f7564bd
[09:33:06,296][SEVERE][mgmt-#66%null%][CacheOnlyStoreFactoryExampleUsingMysql] spring配置文件中的数据ds null
说明已经无法使用原生的spring的注入方法来注入对象实例资源。

还有一个有趣的事情,看上面的java代码,类定义
public class CacheOnlyStoreFactoryExampleUsingMysql extends JdbcDaoSupport implements CacheStore<Long,Person>,BeanFactoryAware,Serializable{,本类实现了BeanFactoryAware接口,并且有如下的方法实现,

  1. public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
  2. logger.error("初始化后");
  3. DataSource ds = (DataSource) beanFactory.getBean("tybbs_user_datasource");
  4. logger.error("ds是否为空" + (ds == null));
  5. this.setDataSource(ds);
  6. }

照理,这个类不管在客户端还是服务器端被初始化(spring还是ignite来初始化该类),都应该会执行该方法中的代码,但是通过日志观察只在客户端执行了该方法,服务端没有执行该方法中的代码?这是为什么?等以后有时间查看ignite源码再写下相关答案!

另外从文档中看到一些关于ignite资源注入的信息,

预定义的资源

有很多的预定义资源可供注入:

资源 描述
CacheNameResource 由CacheConfiguration.getName()提供,注入网格缓存名
CacheStoreSessionResource 注入当前的CacheStoreSession实例
IgniteInstanceResource 注入当前的Ignite实例
JobContextResource 注入ComputeJobContext的实例。作业的上下文持有关于一个作业执行的有用的信息。比如,可以获得包含与作业并置的条目的缓存的名字。
LoadBalancerResource 注入ComputeLoadBalancer的实例,注入以后,可以用于明确的负载平衡。
LoggerResource 注入IgniteLogger的实例,他可以用于向本地节点的日志写消息。
ServiceResource 通过指定服务名注入Ignite的服务。
SpringApplicationContextResource 注入Spring的ApplicationContext资源。
SpringResource 从Spring的ApplicationContext注入资源,当希望访问在Spring的ApplicationContext XML配置中指定的一个Bean时,可以用它。
TaskContinuousMapperResource 注入一个ComputeTaskContinuousMapper的实例,持续映射可以在任何时点从任务中发布作业,即使过了map的初始化阶段。
TaskSessionResource 注入ComputeTaskSession资源的实例,它为一个特定的任务执行定义了一个分布式的会话。

x

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注