hazelcast入门教程

这是我的Hazelcast系列的第四部分。 如果一个人没有看到其他三个人,我建议一个人去看第1 部分 , 第2 部分和第3部分 。

记录中

日志记录是任何应用程序的重要功能,我的示例也是如此。 System.out.println可以用作告诉用户控制台应用程序中正在发生什么的有用工具。 但是,让我们面对现实吧,如果您正在阅读如何为分布式应用程序使用工具,那么该人确实不是初学者。 看到一系列日志消息不应吓到任何人。 实际上,对于本文中的示例,他们有必要了解谁在做什么。 毕竟,我们将讨论线程编程。

Hazelcast的好伙伴似乎已经同意日志记录很重要,因此有许多不同的方法来定义正在记录的库。 日志记录框架仅取决于JDK日志记录,并且具有许多适配器,甚至允许自定义日志记录框架。 一个人选择的日志适配器由属性hazelcast.logging.type设置为以下设置:

  • JDK日志记录,这是默认设置。
  • log4j
  • slf4j
  • 没有

我使用了Log4j2,所以我选择了slf4j并放入了使其工作所需的四个 jar文件。

旋转分布式线程

像Hazelcast中的许多类一样,IExecutorService实现了Java库ExecutorService的接口。 该接口定义什么是线程池。 该接口是java.util.concurrent包的一部分,自Java 1.5开始就存在。 该程序包还具有其实现,可以从java.util.concurrent.Executors中进行访问。 我希望我在Java 1.4或1.3或1.2或1.1中有类似的东西。 直到发生死锁之前,使线程池变得很有趣。 现在,我可以使用Java库的池了,对我来说已经足够了。

ExecutorService具有有趣的“功能”。 必须关闭它们,否则服务不会消失。 第一次使用它们时,导致内存泄漏并关闭了JVM。 我在自己的测试中发现了该错误,因此客户不必再看到我的学习经验。 IExecutorService的皱纹有所不同。 在所有线程完成之前,该服务不会消失。 这导致许多不正常的关机。 你被警告了!

IExecutorServices可以几种不同的方式共享线程。 这里是它们的详细信息:

任何'Ole实例

这是一个只调用submit(Callable call). 这不仅仅只是将线程随机设置到集群中。 它对该线程进行了一些负载平衡,因此实例不会被线程破坏。

致特定成员

这是通过submit(Callable call, Member member)方法完成的。 这会将线程发送到集群的特定成员。 这里没有负载平衡; 只是发送给会员。 小心,一个成员很容易过载,并在进行任何处理时真正踩刹车。 我可以将其视为创建自定义负载均衡器的一种方式。

致会员集合

是的,可以将一个线程发送给多个成员。 当我进行示例编码时,所有成员的行为就像他们拥有自己的线程并且不共享线程。 如果将Callable <T>作为其线程实现来实现,则该方法使用成员作为键返回“未来地图”。 如果使用Runnable,则不返回任何内容。

用正确的钥匙致会员

IMap的条目可以在群集中的任何位置。 如果需要对该条目进行处理,则本地线程将必须通过网络上拉该条目。 如果条目很大,可能会出现问题。 更好的方法是将希望较小的线程转移到条目上。 为此,群集需要知道将其发送到哪里。 因此,呼叫submit(Callable call, Object key)

致全体会员

这与提交成员集合的方式相同,但是就像集群中的每个成员一样,都是成员。 如果一个集群中有大量成员,这可能会很“有趣”。 我想我在一个集群中听到了多达1000名成员。 确保这是人们想要的,然后再调用它。

使用ExecutionCallback

这基本上是一种发出一些线程并异步返回结果的方法。 如果提交了一个线程,则使用ExecutionCallback。 如果涉及多个成员,则使用MultiExecutionCallback。

范例程式码

在开始之前,请允许我说我没有IExecutorService中每个方法的示例。 但是,对于每种讨论的类型,我都有一个示例。 关于示例代码的另一件事。 出于指导目的,我在以前的文章中做了一些复制和粘贴编码,因此每个示例可以独立存在,并且可以了解所处位置。 我在第3部分中做了很多。 如果没有注意到,请再次查看。

这次我没有这样做,因为将会复制很多代码,并且结果会非常难看。 我使用了一个Enum,我认为结果非常好。 由于示例数量有限,我认为枚举是一个不错的选择,并且使我能够以块的形式显示代码,而如果首先显示框架,则可以理解。

有了这个解释,让我们继续前进!

构架

这是主要的位。 它由主类和线程类组成。 注意主类如何显示调用线程可以提交的每种方式。

主要

package hazelcastservice;import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.IExecutorService;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.RejectedExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/**** @author Daryl*/
public class Main {private static final Logger logger = LoggerFactory.getLogger(Main.class);public static final String SERVICE_NAME = "spinnerella";public static final int NUM_INSTANCES = 5;/*** @param args the command line arguments*/public static void main(String[] args) {System.setProperty("hazelcast.logging.type", "slf4j");List<HazelcastInstance> instances = new ArrayList<>(NUM_INSTANCES);for(int i = 0; i < NUM_INSTANCES; i++) {instances.add(Hazelcast.newHazelcastInstance());logger.info("instance {} up", i);}IExecutorService spinner = instances.get(0).getExecutorService(SERVICE_NAME);try {HazelcastIExecutorServiceExamples.TO_SOME_MEMBER.example(instances, spinner);HazelcastIExecutorServiceExamples.TO_PARTICULAR_MEMBER.example(instances, spinner);HazelcastIExecutorServiceExamples.ON_THE_KEY_OWNER.example(instances, spinner);HazelcastIExecutorServiceExamples.ON_A_SET_OF_MEMBERS.example(instances, spinner);HazelcastIExecutorServiceExamples.ON_ALL_MEMBERS.example(instances, spinner);HazelcastIExecutorServiceExamples.CALLBACK.example(instances, spinner);HazelcastIExecutorServiceExamples.MULTIPLE_MEMBERS_WITH_CALLBACK.example(instances, spinner);//Lets setup a loop to make sure they are all done (Especially the callback ones)for(HazelcastIExecutorServiceExamples example: HazelcastIExecutorServiceExamples.values()) {while(!example.isDone()) {Thread.sleep(1000);}}} catch(ExecutionException ee) {logger.warn("Can't finish the job", ee);} catch(InterruptedException ie) {logger.warn("Everybody out of the pool", ie);} finally {// time to clean up my toysboolean allClear = false;while(!allClear) {try {Thread.sleep(1000);Hazelcast.shutdownAll();allClear = true;} catch(InterruptedException ie) {//got interrupted. try again} catch(RejectedExecutionException ree) {logger.debug("caught a RejectedExecutionException");allClear = false;}}logger.info("All done");}}
}

线

package hazelcastservice;import java.io.Serializable;
import java.util.Random;
import java.util.concurrent.Callable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** This class was inspired by the song "I Like to Move it" from the movie * Madagascar by Dreamworks.  I offer NO apologies for using it.  * * To those software developers who like consistent results, I used java.util.Random to* make it loop inconsistently each time call is called.  * * Sometimes you need to make your own entertainment.* @author Daryl*/
public class MoveItMoveIt implements Callable<Integer>, Serializable {private static final Logger logger = LoggerFactory.getLogger(MoveItMoveIt.class);private static final int UPPER_BOUND = 15;@Overridepublic Integer call() throws Exception {Random random = new Random();int howMany = random.nextInt(UPPER_BOUND);
//        int howMany = 2;for(int i = 0; i < howMany; i++) {logger.info("I like to Move it Move it!");}logger.info("Move it!");return howMany;}
}

细节

在这里,我将展示所讨论的不同类型的呼叫。 请记住,这些是Enum类的块。 done是一个受保护的变量,并且需要实现public void example(List<HazelcastInstance> instances, IExecutorService spinner)

任何'Ole实例

TO_SOME_MEMBER() {@Overridepublic void example(List<HazelcastInstance> instances, IExecutorService spinner)throws ExecutionException, InterruptedException {logger.info("Submit to some member.");Future<Integer> howMany = spinner.submit(new MoveItMoveIt());logger.info("It moved it {} times", howMany.get());done = true;}}

致特定成员

TO_PARTICULAR_MEMBER {@Overridepublic void example(List<HazelcastInstance> instances, IExecutorService spinner)throws ExecutionException, InterruptedException {logger.info("Submit to a particular member.");Member member = getRandomMember(instances);logger.debug("member is {}", member);Future<Integer> howMany = spinner.submitToMember(new MoveItMoveIt(), member);logger.info("It moved it {} times.", howMany.get());done = true;}private Member getRandomMember(List<HazelcastInstance> instances) {Set<Member> members = instances.get(0).getCluster().getMembers();int i = 0;int max = new Random().nextInt(instances.size());Iterator<Member> iterator = members.iterator();Member member = iterator.next();while(iterator.hasNext() && (i < max)) {member = iterator.next();i++;}return member;}}

致会员集合

ON_A_SET_OF_MEMBERS {@Overridepublic void example(List<HazelcastInstance> instances, IExecutorService spinner)throws ExecutionException, InterruptedException {logger.info("Send to some of the members");Set<Member> randomMembers = getRandomMembers(instances);Map<Member, Future<Integer>> results = spinner.submitToMembers(new MoveItMoveIt(), randomMembers);for(Future<Integer> howMany: results.values()) {logger.info("It moved {} times", howMany.get());}done = true;}private Set<Member> getRandomMembers(List<HazelcastInstance> instances) {int max = new Random().nextInt(instances.size());Set<Member> newSet = new HashSet<>(instances.size());int k = 0;Iterator<Member> i = instances.get(0).getCluster().getMembers().iterator();while(i.hasNext() && k < max) {newSet.add(i.next());k++;}return newSet;}}

用正确的钥匙致会员

ON_THE_KEY_OWNER {@Overridepublic void example(List<HazelcastInstance> instances, IExecutorService spinner)throws ExecutionException, InterruptedException {logger.info("Send to the one owning the key");HazelcastInstance randomInstance = getRandomInstance(instances);IMap<Long, Boolean> map = randomInstance.getMap("default");Long one = 1L;map.put(one, Boolean.TRUE);Future<Integer> howMany = spinner.submitToKeyOwner(new MoveItMoveIt(), one);logger.info("It moved it {} times.", howMany.get());done = true;}private HazelcastInstance getRandomInstance(List<HazelcastInstance> instances) {return instances.get(new Random().nextInt(instances.size()));}}

致全体会员

ON_ALL_MEMBERS {@Overridepublic void example(List<HazelcastInstance> instances, IExecutorService spinner)throws ExecutionException, InterruptedException {logger.info("Send to all members");Map<Member, Future<Integer>> results = spinner.submitToAllMembers(new MoveItMoveIt());for(Future<Integer> howMany: results.values()) {logger.info("It moved {} times", howMany.get());}done = true;}}

使用ExecutionCallback

此示例代码包含两段代码,分别显示一个回调和多个回调。

CALLBACK {@Overridepublic void example(List<HazelcastInstance> instances, IExecutorService spinner)throws ExecutionException, InterruptedException {logger.info("example with a callback");spinner.submit(new MoveItMoveIt(), new ExecutionCallback<Integer>() {@Overridepublic void onResponse(Integer response) {logger.info("It moved {} times", response);done = true;}@Overridepublic void onFailure(Throwable thrwbl) {logger.error("trouble in the callback", thrwbl);done = true;}});}        },MULTIPLE_MEMBERS_WITH_CALLBACK {@Overridepublic void example(List<HazelcastInstance> instances, IExecutorService spinner)throws ExecutionException, InterruptedException {logger.info("running on multiple members with callback");spinner.submitToAllMembers(new MoveItMoveIt(), new MultiExecutionCallback() {@Overridepublic void onResponse(Member member, Object o) {logger.info("member finished with {} moves", o);}@Overridepublic void onComplete(Map<Member, Object> map) {logger.info("All members completed");for(Object value: map.values()) {logger.info("It moved {} times", value);}done = true;}});}

结论

再次在自己的博客上发布自己的代码/想法非常好。 我快速浏览了Hazelcast的IExecutorService的功能。 我的示例代码遵循DRY原理。 完整的代码可以在这里找到。

参考资料

与我的Hazelcast指南一样,我的信息来自Hazelcast文档,可在此处找到。

翻译自: https://www.javacodegeeks.com/2014/10/beginners-guide-to-hazelcast-part-4.html

hazelcast入门教程

hazelcast入门教程_Hazelcast入门指南第4部分相关推荐

  1. hazelcast入门教程_Hazelcast入门指南第6部分

    hazelcast入门教程 这是有关Hazelcast的一系列文章中的第六篇. 如果一个人没有看过过去的五年,请到表中的内容后 ,我创建赶上. 本地客户 在上一篇文章之后,我决定要去本地化. 是的,我 ...

  2. hazelcast入门教程_Hazelcast入门指南第3部分

    hazelcast入门教程 这是从初学者的角度来看一系列有关如何使用Hazelcast的文章的延续. 如果您还没有阅读最后两个,我鼓励阅读它们: Hazelcast入门指南第1部分 Hazelcast ...

  3. hazelcast入门教程_Hazelcast入门指南第7部分

    hazelcast入门教程 这是解释如何使用Hazelcast的系列文章的续篇. 如果一个人没有阅读其他六个帖子,请转到目录并阅读其他帖子. 不同的地图种类 Hazelcast的MultiMap打破了 ...

  4. hazelcast入门教程_Hazelcast入门指南第5部分

    hazelcast入门教程 这是我撰写的有关Hazelcast的一系列文章的延续. 我强烈建议您阅读其他内容: 第1 部分 , 第2 部分 , 第3 部分和第4部分 . 一气呵成的东西 这篇文章中没有 ...

  5. hazelcast入门教程_Hazelcast入门指南第2部分

    hazelcast入门教程 本文是我开始使用Hazelcast (分布式内存数据库)的系列文章的继续. 如果尚未阅读第一篇文章,请单击此处 . 分布式馆藏 Hazelcast具有许多可用于存储数据的分 ...

  6. hazelcast入门教程_Hazelcast入门

    hazelcast入门教程 7月,我写了一个博客向Java开发人员介绍erlang,重点介绍了这两种语言之间的一些异同. erlang虚拟机具有许多令人印象深刻的内置功能,其中之一是它们独立于位置且可 ...

  7. 基金投资入门教程-----基金入门

    基金投资入门教程-----基金入门 基金投资入门教程-----基金入门 1.基金入门 什么是基金 基金的三大优势 基金的风险 基金投资入门教程-----基金入门 1.基金入门 什么是基金 基金的三大优 ...

  8. 计算机linux入门教程,Turbolinux入门教程1

    原标题:Turbolinux入门教程1 第一课:什么是Linux 简单地说, Linux 是一套免费使用和自由传播的类 Unix 操作系统,它主要用于基于 Intel x86 系列 CPU 的计算机上 ...

  9. python入门教程pdf-Python入门教程详解.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspPython Python入门教程详解.pdf132页 本文档一 ...

最新文章

  1. python图像验证码识别_python 简单图像识别--验证码
  2. 完全掌握JavaMail
  3. gdb调试时查看内存
  4. 计算机专硕没有宿舍,没有补贴,不提供宿舍,读研究生还要家里支持,应届生读非全太难...
  5. meta http-equiv=refresh content=3 什么意思?
  6. chromebook刷机_如何在Chromebook上拍照
  7. 真的有无人工厂吗,IoT 怎么在产业界落地?| 赠书
  8. 转: SQL Server Analysis Service中Cube的结构
  9. python使用json序列化datetime类型问题处理
  10. arm平台函数传递参数,反汇编实例分析
  11. scala map与mapPartitions区别
  12. 安防行业相关标准、法律及规划一览
  13. react中对props.children进行操作
  14. 给定一个字符串,求第一个不重复的字符
  15. Hamilton哈密顿最短路径(二进制状态压缩)
  16. Google Docs 简介
  17. dell计算机的硬盘如何分区,戴尔电脑分盘怎么分区
  18. 集线器(HUB)、交换机(Switch)、路由器(Router)
  19. 正则表达式判断手机号码运营商
  20. 蔓迪、落健、heybro、达霏欣哪个效果更好?自然选蔓迪

热门文章

  1. 学习手记(2018/7/14~2018/7/18)——快乐纪中
  2. 邓公数据结构C++语言版学习笔记1
  3. 纪中A组模拟赛总结(2021.7.15)
  4. 【图论】【Kosaraju】刻录光盘(ssl 2344)
  5. vue watch监听对象
  6. Java开发必会的反编译知识
  7. java提高篇之抽象类与接口
  8. Spring Boot Debug调试
  9. 最全、最详细的配置jdk十步法!
  10. java实现加密电话号码,有具体的加密流程注释