有了分布式网格,一个很朴素的想法就是能将自己的应用部署到网格中运行,并且网格可以保证HA和failover。 Ignite可以非常便利的实现这一点,废话不多说,直接开干。
需求
一个定时任务,可以根据指定的时间周期向client节点发出信息
实现
- 作业调度
需求中需要服务可以周期性执行,显然需要有简单的作业调度功能。Ignite中有scheule模块,只不过由于是LGPL的license,因此build-in的模块中没有,需要手动build
下载Ignite源码包,如 apache-ignite-2.2.0-src.zip
解压并进入apache-ignite-2.2.0-src\modules\schedule目录
执行命令 mvn clean package -DskipTests -Prelease,lgpl
进入target目录,将ignite-schedule-2.2.0.jar和libs\cron4j-2.2.5.jarcopy至IGNITE_HOME\libs目录下
这样,Ignite就可以调度作业了
- 实现service
Ignite的Servcie Grid服务需要实现IgniteServices接口, 而Ignite可以保证服务可以以Node Singleton或者Cluster Singleton模式运行并实现负载均衡
public class MyServiceImpl implements Service {
@IgniteInstanceResource
private Ignite ignite;
private String svcName;
@Override
public void init(ServiceContext ctx) {
svcName = ctx.name();
System.out.println("Service was initialized: " + svcName);
IgniteMessaging rmtMsg = ignite.message(ignite.cluster().forClients());
rmtMsg.remoteListen("MyOrderedTopic", (nodeId, msg) -> {
System.out.println("Received ordered message [msg=" + msg + ", from=" + nodeId + ']');
return true; // Return true to continue listening.
});
ignite.scheduler().scheduleLocal(
new Runnable() {
@Override
public void run() {
rmtMsg.send("MyOrderedTopic", "hello");
System.out.println("Send message");
}
}, "* * * * *" //send msg every mintue
);
}
@Override
public void cancel(ServiceContext ctx) {
System.out.println("Service was cancelled: " + svcName);
}
@Override
public void execute(ServiceContext ctx) {
// Since our service is simply demo, there is nothing we need
// to do in order to start it up.
System.out.println("Executing distributed service: " + svcName);
}
}
- build service jar 包
通过maven将此代码build成jar包后放置到IGNITE_HOME\libs目录下, 由于Ignite现不支持service的Zero Deployment, 因此此jar包需要放置到所有需要运行此服务的所有节点中
- 配置service服务
打开配置文件,编辑如下内容
<bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="serviceConfiguration">
<list>
<bean class="org.apache.ignite.services.ServiceConfiguration">
<property name="name" value="MyClusterSingletonSvc"/>
<property name="maxPerNodeCount" value="1"/>
<property name="totalCount" value="1"/>
<property name="service">
<ref bean="myServiceImpl"/>
</property>
</bean>
</list>
</property>
</bean>
<bean id="myServiceImpl" class="com.abc.igniteservicedemo.MyServiceImpl"/>
</bean>
这里我们设定此服务为Cluster Singleton模式,如需要设置Node Singleton模式,去掉
<property name="totalCount" value="1"/>
即可
- 启动Ignite后会看到如下输出
[18:10:55] Security status [authentication=off, tls/ssl=off]
Service was initialized: MyClusterSingletonSvc
Executing distributed service: MyClusterSingletonSvc
[18:10:59] Performance suggestions for grid (fix if possible)
... ...
[18:10:59] Topology snapshot [ver=1, servers=1, clients=0, CPUs=4, heap=1.0GB]
Send message
Send message
至此,我们实现了一个简单的service grid服务