JAVA BAE 問題總結

自己總結了一些在部署Java版的BAE中,得到的經驗。

1. 邀請碼申請

不做詳述,最好描述一下團隊組員情況

2. 環境搭建問題

前提是你知道SVN插件的安裝以及BAE插件安裝。無誤後,按照以下步驟進行:

2.1. checkout相應工程的版本號

下圖所示的爲某個工程的版本號1

 

2.2轉化成BAE工程

checkout出來的工程,爲一個普通的工程, 因此需要轉化成BAE工程。同時,Checkout出來的工程是有編譯錯誤的,只有轉化爲BAE,才能將IDE的環境搭建好。編譯無問題。

 

2.3 規範化項目名稱,方便管理

1. 修改.project文件, 將工程名修改爲自己需要的工程名稱, 如下圖所示


2. 同時在工程名稱上按F2, 重命名爲修改的工程名,並提交修改

3. 編譯問題

3.1 靜態變量無法常駐內存

每次Servlet的調用,都會重新開啓一個ClassLoader,因此,你無需寫單例模式了。即使是同一個客戶端調用,BAE也會重新加載一個Servlet. 所以,變量是無法維繫的。

陳葵<for_lich> 2012-10-22 20:03:19

回覆 ostrichmyself: 請問BAE中,Java的靜態成員變量每次都會被釋放, 請問有什麼替代方案嗎? 可以讓變量常駐內存 靜態成員變量並沒有每次被釋放

陳葵<for_lich> 2012-10-22 20:04:34

只不過bae java環境是分佈式集羣環境,你的請求會隨機分到某個web server處理。這種情況下你應該將數據保存在雲數據庫或cache服務當中

ostrichmyself 10:04:20

cache服務 是指什麼? 請大牛提供相關資料、

ostrichmyself 10:06:25

java分佈式集羣環境, 同一個客戶端對服務端發起請求, static變量需要重新new, 貌似也不符合規則吧

上吊de魚<tianice1234> 10:08:47

集羣的負載均衡沒有黏貼session,session做的複製,當然符合規則了


孟憲森<tjudream> 10:10:06

回覆 ostrichmyself: cache服務 是指什麼? 請大牛提供相關資料、 http://developer.baidu.com/wiki/index.php?title=%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3%E9%A6%96%E9%A1%B5/%E4%BA%91%E7%8E%AF%E5%A2%83/JAVA%E6%9C%8D%E5%8A%A1%E5%88%97%E8%A1%A8/Cache

首頁>幫助文檔首頁>雲環境>JAVA服務列表>Cache



具體使用的方式是: 

		BaeMemcachedClient a = new BaeMemcachedClient();

		Object obj = a.get("XXX");
		if (obj == null)
		{
			//注意, mgrIndtance 需要是可序列化的實例,即其本身以及內部的對象都實現Serialiable接口
			boolean value = a.add("XXX", mgrIndtance);
                        //返回true,則表示增加進去了,如果非序列化對象則會返回爲false
		}


但這個會帶來新問題:

重新發布版本,不會讓Cache清空, 這個時候,建議寫一個獨立的Clean Servlet,  系統調用的時候, 將這些cache delete掉,這個是我暫時能想到的方法.

boolean delResult = cache.delete(ConstantConf.KEY_CACHE_CONF_MGR);

當然這個Servlet會獨立調用, 最好傳入用戶名和密碼進行身份驗證,避免不必要的清空(我的應用就是這這麼做的)。

1. 需要更新時,  不要以爲從 MemCache中獲取對象的引用, 更改完後能保存到MemCache中,  這樣做是無效的, 正確的做法:  用set方法, 將這個引用重新設置, 才能保存!


2. MemCache中存在的對象, 都需要採用序列化接口

3.2 Jar包統一放入lib文件夾,無需寫配置

由於本地環境配置了com.baidu.bdt.bae.java.SDK_CONTAINER,所以,很多jar包都在本地編譯和運行無誤,但是部署到BAE服務器將報錯。

典型的例子:

1. JSON解析

2. xml 解析

 

建議將IDE環境下用到的包,全部Copy到工程路徑的lib目錄下,IDE環境下包的位置爲:

Eclipse根目錄plugins\com.baidu.bdt.bae.java.sdkbundle_1.5.0.201210091104\sdk\

com.baidu.bae.api.lib

3.3 亂碼導致BAE服務端發佈失敗

一旦BAE發佈不成功,並且查看日誌,出現下面的亂碼, 需要修改編碼方式:

2012-10-2210:50:350 [javac] /*??????????*/

 

BAE服務端默認的編碼爲UTF-8, 因此我們建議統一編碼爲UTF-8,修改方式如下圖所示:

 

 

修改的時候,文本文件中中文部分將變成亂碼,注意修改這些亂碼。


3.4  添加用戶日誌


Log4j.properties文件放在WEB-INFO根目錄下

選擇對應版本查看日誌, 已經發布的版本,查看線上版本。 這個非常有用, 因爲BAE服務端的環境跟客戶端的環境完全不同, 服務端定位問題,不能靠Debug,只能用打印日誌的方式。

另外,對於BAE提供的功能, 做充分的測試之後再使用, 比如利用其中一個配額的工程,專門做測試。 不輕易使用產品庫做實驗。 這樣避免帶來資源的浪費,以及管理的不便。

4. 發佈環境

提交代碼即可發佈,不過要等待的時間非常久. 不需要Deploy to BAE


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章