这是我的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。
范例程式码
在开始之前,请允许