Apache Geode(二):JAVA API

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)工程,成功如下所示:

run.png

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é)果:


query.png

常見(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)連接:


pool.png

每個(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ù)如何訂閱。


sub.png

程序媛小白一枚授段,如有錯(cuò)誤蹲蒲,煩請(qǐng)批評(píng)指正!(#.#)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末侵贵,一起剝皮案震驚了整個(gè)濱河市届搁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窍育,老刑警劉巖卡睦,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蔫骂,居然都是意外死亡么翰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)辽旋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)浩嫌,“玉大人,你說(shuō)我怎么就攤上這事补胚÷肽停” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵溶其,是天一觀(guān)的道長(zhǎng)骚腥。 經(jīng)常有香客問(wèn)我,道長(zhǎng)瓶逃,這世上最難降的妖魔是什么束铭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任廓块,我火速辦了婚禮,結(jié)果婚禮上契沫,老公的妹妹穿的比我還像新娘带猴。我一直安慰自己,他們只是感情好懈万,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布拴清。 她就那樣靜靜地躺著,像睡著了一般会通。 火紅的嫁衣襯著肌膚如雪口予。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天涕侈,我揣著相機(jī)與錄音沪停,去河邊找鬼。 笑死驾凶,一個(gè)胖子當(dāng)著我的面吹牛牙甫,可吹牛的內(nèi)容都是我干的掷酗。 我是一名探鬼主播调违,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼泻轰!你這毒婦竟也來(lái)了技肩?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤浮声,失蹤者是張志新(化名)和其女友劉穎虚婿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體泳挥,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡然痊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屉符。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剧浸。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖矗钟,靈堂內(nèi)的尸體忽然破棺而出唆香,到底是詐尸還是另有隱情,我是刑警寧澤吨艇,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布躬它,位于F島的核電站,受9級(jí)特大地震影響东涡,放射性物質(zhì)發(fā)生泄漏冯吓。R本人自食惡果不足惜倘待,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望组贺。 院中可真熱鬧延柠,春花似錦、人聲如沸锣披。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)雹仿。三九已至增热,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胧辽,已是汗流浹背峻仇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邑商,地道東北人摄咆。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像人断,于是被迫代替她去往敵國(guó)和親吭从。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理恶迈,服務(wù)發(fā)現(xiàn)涩金,斷路器,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 名詞延伸 通俗的說(shuō)全度,域名就相當(dāng)于一個(gè)家庭的門(mén)牌號(hào)碼,別人通過(guò)這個(gè)號(hào)碼可以很容易的找到你斥滤。如果把IP地址比作一間房子...
    楊大蝦閱讀 20,602評(píng)論 2 57
  • 1.OkHttp源碼解析(一):OKHttp初階2 OkHttp源碼解析(二):OkHttp連接的"前戲"——HT...
    隔壁老李頭閱讀 20,848評(píng)論 24 176
  • 【1】睡前故事 你很喜歡聽(tīng)故事将鸵,尤其睡覺(jué)前,大多時(shí)候你還會(huì)給我命題中跌,“我想聽(tīng)小烏龜?shù)墓适隆弊傻蹋拔蚁肼?tīng)美人魚(yú)的故事”...
    隱世閑人閱讀 893評(píng)論 5 2
  • 今天晨讀分享的是《感召力》一喘,作者從本能、情感和邏輯這三個(gè)方面,為我們提供如何在溝通中使語(yǔ)言更富有感染力的經(jīng)驗(yàn)凸克。 0...
    鮸魚(yú)閱讀 203評(píng)論 0 1