Aid*_*dos 8 spring quartz-scheduler hazelcast
我正在尝试研究如何为我正在编写的webapp开发一个合理可扩展的批处理框架.
我使用Spring MVC作为webapp,使用自定义DAO层(为了访问数据库,需要从UnitOfWorkFactory构造UnitOfWork实例,该UnitOfWorkFactory设置为@Autowired并由Spring在运行时注入).
我使用Spring Scheduler注释(@Scheduled)来安排任务,但是我希望这些任务在我的集群中的不同机器上运行.每个批处理作业应由其中一个集群计算机选取,然后执行.
Hazelcast似乎非常适合这一点,因为分布式执行设计看起来非常简单和优雅.
我遇到的问题似乎没有被文档覆盖.我已经阅读了有关Spring Integration的文档,但是这似乎集中在如何使用Spring配置Hazelcast(我已经完成).
当调度程序指示要启动任务时,我想创建任务的新实例(Callable实例)并将其提交给DistributedExecutor.当集群机器收到要运行的任务时,我需要集群机器上的Spring容器在任务尝试执行它之前将UnitOfWorkFactory实例注入批处理任务.每个集群都以Spring开头,并且已经使用正确的细节实例化了UnitOfWorkFactory,问题在于将UnitOfWorkFactory实例注入到我的任务中.
有没有人知道如何配置我的应用程序,以便Hazelcast可以在Callable启动时自动注入UnitOfWorkFactory?我已经尝试将Callable标记为Serializable和ApplicationContextAware,但在尝试运行任务时仍然会得到NullPointerException.
我可以直接访问ApplicationContext,但是我不愿意这样做,因为它会限制我的任务的可测试性,并为我的批处理作业引入了对Spring的硬依赖.
通过版本2.1, Hazelcast可以将Spring上下文和/或Spring bean注入Hazelcast管理对象.
如果使用Hazelcast Spring配置配置Hazelcast并使用注释bean @SpringAware,Hazelcast将要求Spring注入该bean的依赖项.
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:hz="http://www.hazelcast.com/schema/spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.hazelcast.com/schema/spring
http://www.hazelcast.com/schema/spring/hazelcast-spring-2.1.xsd">
<hz:hazelcast id="instance">
<hz:config>
<hz:group name="dev" password="password"/>
<hz:network port="5701" port-auto-increment="false">
<hz:join>
<hz:multicast enabled="false" />
<hz:tcp-ip enabled="true">
<hz:members>10.10.1.2, 10.10.1.3</hz:members>
</hz:tcp-ip>
</hz:join>
</hz:network>
...
</hz:config>
</hz:hazelcast>
<bean id="someBean" class="com.hazelcast.examples.spring.SomeBean"
scope="singleton" />
...
</beans>
Run Code Online (Sandbox Code Playgroud)
@SpringAware
public class SomeTask implements Callable<Long>, ApplicationContextAware, Serializable {
private transient ApplicationContext context;
private transient SomeBean someBean;
public Long call() throws Exception {
return someBean.value;
}
public void setApplicationContext(final ApplicationContext applicationContext)
throws BeansException {
context = applicationContext;
}
@Autowired
public void setSomeBean(final SomeBean someBean) {
this.someBean = someBean;
}
}
Run Code Online (Sandbox Code Playgroud)
对于2.1以上的旧版本:
Hazelcast的2.1版之前的版本不是Spring知道,所以这是不可能注入Spring上下文或任何的Spring bean成为Hazelcast管理对象进行预2.1版本.
Hazelcast集团有一篇关于此功能的帖子.
Callable的Hazelcast/Dependency注入
您可能已经在Hazelcast组中了解并建议您使用以下方法访问Spring ApplicationContext;
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext context = null;
public synchronized void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
if(context == null) {
context = applicationContext;
}
}
public static <T> T getBean(String name) {
return (T) context.getBean(name);
}
}
class MyCallable implements Callable {
....
public Object call() throws Exception {
SomeServiceBean bean = ApplicationContextProvider.getBean("serviceBean");
....
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4007 次 |
| 最近记录: |