@aloxc
2017-12-05T06:22:07.000000Z
字数 4225
阅读 513
ignite
ioc
spring
di
一般情况下,我们在使用spring做开发的时候,资源注入使用@AutorWired或者@Resource、或者在配置文件中注入。这些都没问题,但是放在ignite中将不能自动正确的注入,可能会注入失败,注入了null对象,大家一起来看下如下代码,
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="tybbs_user_datasource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://192.168.20.185:3306/xefge"></property>
<property name="username" value="root"></property>
<property name="password" value="abcef0pDL2vF"></property>
</bean>
@Component
public class CacheOnlyStoreFactoryExampleUsingMysql extends JdbcDaoSupport implements CacheStore<Long,Person>,BeanFactoryAware,Serializable{
private final static String TABLE_NAME = "ignite_person";
private static final long serialVersionUID = -309306329114471641L;
@SpringResource(resourceName = "tybbs_user_datasource")
private transient DriverManagerDataSource tybbs_user_datasource;
@Autowired
private transient DriverManagerDataSource tybbs_user_datasource1;
@Override
public void loadCache(final IgniteBiInClosure<Long, Person> igniteBiInClosure, @Nullable Object... objects) throws CacheLoaderException {
logger.error("spring配置文件中的数据ds " + (tybbs_user_datasource != null ? tybbs_user_datasource : null));
logger.error("spring配置文件中的数据ds " + (tybbs_user_datasource1 != null ? tybbs_user_datasource1 : null));
logger.error("从数据库加载所有数据");
long start = System.currentTimeMillis();
StringBuffer sql = new StringBuffer();
sql.append("SELECT `id`,");
sql.append("`first_name`, `last_name`");
sql.append(" FROM `").append(TABLE_NAME).append("` WHERE 1 = 1");
sql.append(" ORDER BY `id` DESC");
logger.error("spring jdbc Template 是否为空 " + (this.getJdbcTemplate() == null));
// boolean isDebug = true;
// if(isDebug)throw new CacheLoaderException("aaa");
List<Person> list = this.getJdbcTemplate().query(sql.toString(), new CacheLoadOnlyStoreRowMapper<Person>());
for(Person person : list){
igniteBiInClosure.apply(person.getId(),person);
}
logger.error("从数据库加载所有数据花费" + (System.currentTimeMillis() - start) + "毫秒");
}
}
这段代码不是这个类的完整代码,只为演示,大家自己做测试的时候自己补充完所有代码。
代码里面有两个需要注入的地方,
@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接口,并且有如下的方法实现,
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
logger.error("初始化后");
DataSource ds = (DataSource) beanFactory.getBean("tybbs_user_datasource");
logger.error("ds是否为空" + (ds == null));
this.setDataSource(ds);
}
照理,这个类不管在客户端还是服务器端被初始化(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资源的实例,它为一个特定的任务执行定义了一个分布式的会话。 |