1)在IDEA中新建一個(gè)maven工程
2)在pom.xml文件中添加如下的依賴(lài)
<dependency>
<groupId>org.apache.geode</groupId>
<artifactId>geode-core</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.geode</groupId>
<artifactId>geode-common</artifactId>
<version>1.1.0</version>
</dependency>
3)新建一個(gè)實(shí)體類(lèi)
public class UserBean implements DataSerializable {
private int id;
private int age;
private String name;
private Date createDate;
public UserBean() {
}
public UserBean(int id, int age, String name, Date createDate) {
this.id = id;
this.age = age;
this.name = name;
this.createDate = createDate;
}
@Override
public void fromData(DataInput in) throws IOException, ClassNotFoundException {
this.id = in.readInt();
this.age = in.readInt();
this.name = in.readUTF();
this.createDate = DataSerializer.readDate(in);
}
@Override
public void toData(DataOutput out) throws IOException {
out.writeInt(this.id);
out.writeInt(this.age);
out.writeUTF(this.name);
DataSerializer.writeDate(this.createDate, out);
}
@Override
public String toString() {
return "用戶(hù)的信息為:id:" + id + " 年齡為:" + age + " 名字為: " + name + " 創(chuàng)建日期為:" + createDate + "!";
}
//此處省略set,get方法~
}
4)新建一個(gè)GeodeDemo類(lèi)
public class FeodeDemo {
String regionName = "user";
int userNum = 10;
public static void main( String[] args )
{
new FeodeDemo().test();
}
public void test() {
Region region = null;
//使用池連接的方式創(chuàng)建一個(gè)定位器
ClientCache cacheS = new ClientCacheFactory().addPoolLocator("node1", 10334).create();
//在已有的緩存服務(wù)器上連接一個(gè)region鼓寺,CACHING_PROXY表示允許本地?cái)?shù)據(jù)存儲(chǔ)還可以參照官方文檔動(dòng)態(tài)創(chuàng)建region
ClientRegionFactory rf = cacheS.createClientRegionFactory(ClientRegionShortcut.CACHING_PROXY);
region = rf.create(regionName);
//獲取當(dāng)前的分布式服務(wù)器
System.out.println(cacheS.getCurrentServers());
System.out.println("開(kāi)始創(chuàng)建用戶(hù)");
create(region);
select(region);
System.out.println("完成創(chuàng)建用戶(hù)");
System.out.println("開(kāi)始修改用戶(hù)");
update(region);
select(region);
System.out.println("完成修改用戶(hù)");
System.out.println("開(kāi)始刪除用戶(hù)");
delete(region,108);
select(region);
System.out.println("完成刪除用戶(hù)");
System.out.println("開(kāi)始清空表");
truncate(region);
select(region);
System.out.println("完成清空表");
//關(guān)閉表
region.close();
}
/**
* 查詢(xún)user表
* */
public void select(Region region){
try {
Object objList = region.query("select * from /"+regionName+"u where u.age>15");
if (objList != null && objList instanceof ResultsBag){
Iterator iter = ((ResultsBag) objList).iterator();
while (iter.hasNext()){
UserBean userBean = (UserBean) iter.next();
System.out.println("User信息: "+ JSON.toJSONString(userBean));
}
}
Object obj = region.get(108);
if (obj != null && obj instanceof UserBean){
System.out.println("User108的信息: "+ obj.toString());
}
} catch (FunctionDomainException e) {
e.printStackTrace();
} catch (TypeMismatchException e) {
e.printStackTrace();
} catch (NameResolutionException e) {
e.printStackTrace();
} catch (QueryInvocationTargetException e) {
e.printStackTrace();
}
}
//增加10個(gè)
public void create(Region region){
for (int i = 0; i < userNum; i++) {
int id = i + 100 ;
region.put(id,new UserBean(id,10+i,"username:"+id,new Date()));
}
}
public void update(Region region){
UserBean user108 = (UserBean) region.get(108);
if (user108 != null && user108 instanceof UserBean){
System.out.println("User108信息" + JSON.toJSONString(userBean));
user108.setAge(12);
region.put(user108.getId(),user108);
}
}
//刪除某個(gè)用戶(hù)
public void delete(Region region,int id){
region.remove(id);
}
//清空表
public void truncate(Region region){
region.clear();
}
}
動(dòng)態(tài)創(chuàng)建region示例
啟動(dòng)工程,成功如下所示:
Tips:
代碼中的region = rf.create(regionName); 并不能真正在服務(wù)器上創(chuàng)建一個(gè)新的region,只是在客戶(hù)端創(chuàng)建一個(gè)和服務(wù)端類(lèi)似的,相當(dāng)于我們的數(shù)據(jù)庫(kù)工具連接了遠(yuǎn)程的數(shù)據(jù)庫(kù)抑钟,復(fù)制了相同的表結(jié)構(gòu)在本地德迹。綜上,我們?cè)趐ut objec之前寺枉,要把項(xiàng)目打包放到服務(wù)器上抑淫,用deploy命令引用jar包,put姥闪,query對(duì)應(yīng)代碼里的object才
不會(huì)報(bào)錯(cuò)丈冬!
下面是pulse的查詢(xún)結(jié)果:
常見(jiàn)錯(cuò)誤
1)java.net.ConnectException: Connection timed out: connect
如果你們公司用的是阿里服務(wù)器,10334這個(gè)端口之前沒(méi)有用過(guò)甘畅,可以使用一下命令開(kāi)通端口:
/sbin/iptables -I INPUT -p tcp --dport 10334 -j ACCEPT
開(kāi)通完畢埂蕊,可以使用:
telnet ip port 測(cè)試端口是否可以訪(fǎng)問(wèn)
2)Exception in thread "main" org.apache.geode.cache.client.NoAvailableServersException
gfsh 只開(kāi)啟了locator,沒(méi)有一個(gè)server在運(yùn)行往弓,啟動(dòng)至少一個(gè)server
客戶(hù)端 服務(wù)器連接的工作原理
Apache Geode的客戶(hù)端與服務(wù)器連接有2種方式:池連接和訂閱連接
1)池連接
上訴java代碼就是以連接池的形式實(shí)現(xiàn)連接:
每個(gè)池連接都會(huì)轉(zhuǎn)到服務(wù)器正在監(jiān)聽(tīng)的主機(jī):端口位置,服務(wù)器在同意連接上相應(yīng)請(qǐng)求蓄氧,通常函似,客戶(hù)端線(xiàn)程使用池連接進(jìn)行單獨(dú)操作,然后將連接返回到池以供重用喉童,也可以多線(xiàn)程連接撇寞。
連接池可以從服務(wù)器定位器(池隨機(jī)選擇要使用的定位器,并且池會(huì)附帶一個(gè)定位器堂氯,直到連接失斆锏!)和靜態(tài)服務(wù)器列表(靜態(tài)服務(wù)器列表沒(méi)有負(fù)載平衡或動(dòng)態(tài)服務(wù)器發(fā)現(xiàn))中獲取服務(wù)器連接信息。
2)訂閱連接
訂閱連接用于將緩存事件從服務(wù)器傳輸?shù)娇蛻?hù)端咽白。要使用它啤握,請(qǐng)將client屬性設(shè)置subscription-enabled為true。服務(wù)器建立一個(gè)隊(duì)列來(lái)異步發(fā)送訂閱事件晶框,并建立一個(gè)訂閱連接來(lái)處理傳入的消息排抬。發(fā)送的事件取決于客戶(hù)如何訂閱。
程序媛小白一枚授段,如有錯(cuò)誤蹲蒲,煩請(qǐng)批評(píng)指正!(#.#)