文章
网格计算
作者:金辉 (Oracle)
2016 年 5 月 23 日发布
第 1 章 — 漫说内存网格
第 2&3 章 — 安装和配置开发环境
第 4 章 — 开始第一个 Coherence 程序
第 5 章 — 在 Coherence 中使用 POF 对象
第 6 章 — 分布式内存集群的数据灌注、查询和统计
第 7 章 — 监听器处理内存集群中变化的对象
第 8 章 — 使用 ZFS 加密
第 9 章 — 内存集群与数据库的互操作
第 10 章 — Coherence 内存集群的安全访问
第 11 章 — 基于内存集群的事件处理
本章将介绍开发一个简单的,基于 Java 控制台的应用,来访问、更新和删除 Coherence 缓存集群中的信息。两个比较重要的 Java API:
所有的 Coherence 缓存都是有名字的(或说被命名),同时通过实现 com.tangosol.net.NamedCache interface,在集群实例中遵循自己的生命周期。NamedCache 接口扩展了 java.util.Map 接口,存储数据和资源,并在集群网络中共享。每个 NamedCache 对象通过键/值对存储数据。键和值都即可以是简单,也可以是复杂类型的对象。NamedCache 接口提供了 Map 接口的扩展,比如锁、同步、存储、查询、事件聚合和事务。
表 3-1 NamedCache Interface 的方法
| 方法名称 | 描述 |
| void clear() | 移除 NamedCache 对象里的所有记录 |
| boolean containsKey(Object key) | 如果记录中包含相应的键,则返回 true |
| boolean containsValue(Objectvalue) | 如果在 NamedCache 对象中存在至少一条记录有这个对象值,则返回 true |
| Object get(Object key) | 通过给定的键,返回 NamedCache 对象中的值 |
| Object put(Object key,Objectvalue) | 将给定的键值放到 NameCache 中,返回以前的对象(如果有) |
| Object remove(Object key) | 移除给定键的对象。继承自 ConcurrentMapinterface |
| Set entrySet() | 返回键值对的集合 |
| Collection values() | 返回所有值的集合 |
| CacheService getCacheService() | 返回该 NamedCache 所属的 CacheService |
更多完整的 NamedCache interface 和 CacheFactory 类的方法,见文档 C:\Oracle\wls1212.32\coherence\doc
由于在第 3 章中已经创建一个基于 Coherence 的 Java 项目,本章内容参见如下步骤:
1. 在 chapter03_07 项目的 appClientModule 下,创建新的 package
com.oracle.handson.chapter04
2. 在这个 package 下建一个新的 Java Class:MyFirstSamplePut,并选择 the public static void main(String[] args)。
3. 在 Eclipse 编辑器里,写如下代码:创建 NamedCache 对象,并存取值。
package com.oracle.handson.chapter04;
import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;
public class MyFirstSamplePut {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 创建一个叫 mycache 的cache
NamedCache myCache = CacheFactory.getCache("mycache");
// 向这个 cache 存入键值对
myCache.put("Name", "Coherence对象值");
// 从这个 cache 取出键值对
System.out.println("Coherence 缓存的对象值是: " + myCache.get("Name"));
}
}
4. 先停止已运行的 Cache servers,参见 3.5.3。
5. 在 Eclipse IDE 中运行该程序:
右键点击 MyFirstSamplePut.java,Run As->Run Configuration。为方便,下面的步骤的内容是:新建一个 Coherence 运行配置
| 运行配置名称 | chapter04CacheClientMyFirstSample | |
| project | Chapter03_07 | Main选卡 |
| Main Class | com.oracle.handson.chapter04.MyFirstSamplePut | |
| 配置文件 | coherence-cache-config.xml | Coherence选卡 |
| Local storage | Enabled(cache server) | Coherence选卡 |
| Cluster port | 3155 | Coherence选卡 |
| classpath | Coherence.jar 在 Bootstrap Entries 中 | Classpath选卡 |
点 Apply,然后 Run。
新建一个 Java 类,使用 Coherence 的 Get 方法
1. 新建一个 Java 类 MyFirstSampleReader,方法同上节,代码如下
package com.oracle.handson.chapter04; import com.tangosol.net.CacheFactory; import com.tangosol.net.NamedCache; public class MyFirstSampleReader { public MyFirstSampleReader() { // TODO Auto-generated constructor stub } public static void main(String[] args) { // 确保在一个集群里 CacheFactory.ensureCluster(); // 创建或者获得一个叫 mycache 的缓存实例 NamedCache myCache = CacheFactory.getCache("mycache"); System.out.println("缓存的值是" + myCache.get("Name")); } }
2. 为 MyFirstSampleReader 建一个运行配置 chapter04CacheServerMyFirstSampleReader:Run As->Run Configuration。创建方法与过程同 4.2.1。
| 运行配置名称 | chapter04CacheClientMyFirstSample | |
| project | Chapter03_07 | Main选卡 |
| Main Class | com.oracle.handson.chapter04.MyFirstSamplePut | |
| 配置文件 | coherence-cache-config.xml | Coherence选卡 |
| Local storage | Enabled(cache server) | Coherence选卡 |
| Cluster port | 3155 | Coherence选卡 |
| classpath | Coherence.jar 在 Bootstrap Entries 中 | Classpath选卡 |
完成后点击 Run。
这是会发现取缓存为 null。
3. 启动第 3 章中的 chapter03CacheServer
4. 运行上一节的 chapter04CacheClientMyFirstSample,运行后主程序完成,且退出。
再运行 chapter04CacheClientMyFirstSampleReader
由于 chapter04CacheClientMyFirstSample 和 chapter04CacheClientMyFirstSampleReader 都有选择了 storage-enable,所以尽管 MyFirstSamplePut 和 MyFirstSampleReader 都先后退出,但集群中保留有所存数据。下面我们可以测试一下 Local storage 配置为 Disabled 是什么结果。
将 chapter04CacheClientMyFirstSample 的 Coherence 选卡,Local storage 配置为 Disabled(cache client)
<img alt="figure-10" src="/content/groups/public/@otn/documents/digitalasset/3230165_zhs.png" />
这个配置相当于 Java 启动参数 -Dtangosol.coherence.distributed.localstorage=false。
5. 停止所有 Cache Server,重新运行 chapter04CacheClientMyFirstSample,你会有类似下面的界面
6. 启动第 3 章中的 chapter03CacheServer
运行 chapter04CacheClientMyFirstSample
运行 chapter04CacheClientMyFirstSampleReader
可以看到,两个 java 程序通过 Coherence 的内存集群持久化进行数据的交换。
在这个练习中,创建一个 Java 应用,访问、更新和删除 Coherence 集群中的信息。
Coherence-based 的应用通常不是连接到集群中,它们本身就是集群的一部分。
创建应用
运行应用
创建 Java console-based 应用访问、更新和删除 Coherence 集群中的简单类型对象:
1. 写一段 Java 控制台程序,调用 CacheFactory 类加入到集群环境(ensureCluster方法),离开集群(shutdown方法)。操作步骤基本同第三章"3.5.1 创建一个Conerence Java 类"。
1) 取保在集群中的方法,见 NamedCache 的 Javadoc。
2) 通过 getCache 获得一个 NamedCache 的实例。
3) 通过 NamedCache 实例,使用 get 方法获得相应的键值。
package com.oracle.handson.chapter04; import com.tangosol.net.CacheFactory; import com.tangosol.net.NamedCache; public class JavaApp { public JavaApp() { // TODO Auto-generated constructor stub } public static void main(String[] args) { // TODO Auto-generated method stub CacheFactory.ensureCluster(); //ensureCluster(),确保在集群中 NamedCache myCache = CacheFactory.getCache("mycache"); String message = (String) myCache.get("message"); System.out.println(message); CacheFactory.shutdown(); //shutdown() 离开集群 JavaApp testapp = new JavaApp(); } }
步骤如下:
1. 运行第 3 章当中创建的 chapter03CacheServer。
2. 创建一个使用 Coherence 查询语言 (Coherence Query Language) 的 cache 客户端运行配置。
注释:Coherence Query Language 的更多内容见 Oracle 的在线文档。
1) 新建一个 Coherence 运行配置,在 Main class 中,输入 QueryPlus 以帮助定位。
2) 在 Coherence 选卡中,选择 Disabled (cache client);集群端口就沿用之前的 3155。
3) 在 Arguments 选卡中,VM 的参数里输入 -showversion。
4) 在 Common 选卡中,选择 Shared file,并找到当前工程 chapter03_07
点 Apply
3. 运行这个 QueryPlus 客户端,可以看到:
4. 在 CohQL> 提示符中,输入如下命令,建立一个 cache 实例,并连接到这个实例
CohQL> create cache "mycache"
5. 为 4.2 里新建的 JavaApp 创建一个运行环境,起名为 chapter04CacheClientApp。
在 Coherence 选卡中,选择 Enabled (cache server) ;集群端口配置为 3155。
6. 执行这个
7. 在 Eclipse 控制台里,使用 QueryPlus,输入如下命令
CohQL> insert into "mycache" key "message" value "hello"
再次运行 chapter04CacheClientApp
8. 将 chapter04CacheClientApp 的 Local storage 从 Enabled 变为 Disabled,再次运行,结果与第 7 步一样。
9. 将 Cache 服务器停止,并停止 cache 客户端, 运行 chapter04CacheClientApp,输出为 null。
10. 在 QueryPlus cache 客户端里,还可以
CohQL>select key(), value() from "mycache" where key() is "message"
![]() | 金辉,在 Oracle 负责云和中间件产品的资深售前顾问和团队经理,有十多年的中间件和项目管理经验,专注在企业云构建,企业集成解决方案领域,熟悉业内主要的 SOA 集成产品。参加过北京马拉松和 TNF50 越野比赛。你可以通过邮件 arthur.jin@oracle.com 与他联系。 |