zoukankan      html  css  js  c++  java
  • 基于IBM Bluemix的数据缓存应用实例

             林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

              摘要:IBM® Data Cache for Bluemix 是快速缓存服务。支持 Web 和移动应用程序的分布式快速缓存场景。快速缓存服务使用数据网格 技术,您能够在当中存储键值对象。Data Cache 提供了一个业务就绪的内存数据网格 (IMDG)。其将数据放在接近逻辑的位置并随着业务扩展仍将其保留在此。非常easy使用并扩展现有应用程序的性能和可伸缩性。它能够帮助将冗余事务降到最低、提高响应时间并添加现有应用程序基础结构(支持重要应用程序)中的效率。对于添加的冗余。Data Cache 提供快速缓存中存储的数据副本。因此,万一掉线或停运,客户机应用程序仍可訪问快速缓存中的数据。

    本文实例訪问:http://datacachetest.eu-gb.mybluemix.net/

    BluxMix账号注冊:https://apps.admin.ibmcloud.com/manage/trial/bluemix.html?

    cm_mmc=CMDeveloperGCG-_-Bluemix-_-CSDN-_-onlineeventQ2

    一、创建project并加入Data Cache服务

    1、Bluemix个人中心创建projectwebproject

    怎样创建project可看基于IBM Bluemix部署Java Web项目实战演练,这时创建后的project


    2、加入Data Cache 服务

    Data Cache 服务在远程利用数据网格的快速缓存功能并使您能够执行创建、检索、更新和删除操作。

    能够进入到项目中,然后点击加入服务或API,然后搜索data,找到Data Cache就可以。


    选择主要的套餐:



    二、创建本地Java webproject

    最后整个project文件夹例如以下:


    1、创建一个Dynamic web Project

    2、加入jar包

     WebContent/WEB-INF/lib 文件夹加入ogclient.jar 、json-org.jar 

    这两个jar包下载地址,ftp://public.dhe.ibm.com/cloud/bluemix/datacache/

    3、创建连接Data cache的代码

    要使用 Data Cache 服务实例。可在 VCAP_SERVICES 环境变量中找到应用程序与服务实例进行通信所需的不论什么数据。您的应用程序须要包括所需的变量。以与 Data Cache 服务进行通信。

    您能通过包括以下代码片段,以编程方式从 VCAP_SERVICES 环境变量获取变量 gridName、username 和 password,并放入代码。此代码片段将读取 VCAP_SERVICES 环境变量:

    以下的代码放在本地eclipse是无法执行的,它得上传到Bluemixproject中才干够执行

    public void jspInit() {
     		Map<String, String> env = System.getenv();//取得bluemix的当前project
     		String vcap=env.get("VCAP_SERVICES");//取得环境变量 
     		
     		String username=null;
     		String password=null;
     		String endpoint=null;
     		String gridName=null;
     			
            boolean foundService=false;
            if(vcap==null) {
            	System.out.println("No VCAP_SERVICES found");
            } else {
                try {
                	JSONObject obj = new JSONObject(vcap);
                    String[] names=JSONObject.getNames(obj);
                    if (names!=null) {
    					for (String name:names) {
                        	if (name.startsWith("DataCache")) { //取得缓存API
                 				JSONArray val = obj.getJSONArray(name);
                 				JSONObject serviceAttr = val.getJSONObject(0);
                 				JSONObject credentials = serviceAttr.getJSONObject("credentials");
                 				username = credentials.getString("username");
                 				password = credentials.getString("password");             							  
                 				endpoint=credentials.getString("catalogEndPoint");
                 				gridName= credentials.getString("gridName");
                 				System.out.println("Found configured username: " + username);
                 				System.out.println("Found configured password: " + password);
                 				System.out.println("Found configured endpoint: " + endpoint);
                 				System.out.println("Found configured gridname: " + gridName);		
                 				foundService = true;
                 				break;
                 			}                                	                                 	                                 	                                         
                        }
    				}
    			} catch(Exception e) {}
     		}
            
     		if(!foundService) {
       			System.out.println("Did not find WXS service, using defaults");
     		}
     		
     		try {
     			
    			ObjectGridManager ogm = ObjectGridManagerFactory.getObjectGridManager();
    			ClientSecurityConfiguration csc=null;
    			csc=ClientSecurityConfigurationFactory.getClientSecurityConfiguration();
    			csc.setCredentialGenerator(new UserPasswordCredentialGenerator(username,password));
    			csc.setSecurityEnabled(true);
    			
    			ClientClusterContext ccc = ogm.connect(endpoint, csc, null);
    	
    			ObjectGrid clientGrid = ogm.getObjectGrid(ccc, gridName);
    			ogSession = clientGrid.getSession();
    			
     		} catch(Exception e) {
     			System.out.println("Failed to connect to grid!");
     			e.printStackTrace();
     		}
    }
    事实上取得的环境变量在界面上例如以下


    4、创建增、取、删除缓存的代码

    ObjectMap map=ogSession.getMap("mymap.NONE.P");
    map.upsert("key1", "value1");
    Object value = map.get("key1");
    map.remove("key1"); 
    5、合并代码

    由于这里我们要实现的是从前台缓存数据,取数据等。所以后台就要实现将前台传过来的数据缓存。为此。能够将上面的代码合并使用。

    新建一个.jsp文件例如以下:

    dataCache.jsp

    <%@ page pageEncoding="UTF-8"%>
    <%@ page import="java.util.Map" %>
    <%@ page import="org.json.JSONArray" %>
    <%@ page import="org.json.JSONException" %>
    <%@ page import="org.json.JSONObject" %>
    <%@ page import="com.ibm.websphere.objectgrid.*" %>
    <%@ page import="com.ibm.websphere.objectgrid.security.config.*" %>
    <%@ page import="com.ibm.websphere.objectgrid.security.plugins.builtins.*" %>
    <%!
    Session ogSession;
    
    public void jspInit() {
     		Map<String, String> env = System.getenv();//取得bluemix的当前project
     		String vcap=env.get("VCAP_SERVICES");//取得环境变量 
     		
     		String username=null;
     		String password=null;
     		String endpoint=null;
     		String gridName=null;
     			
            boolean foundService=false;
            if(vcap==null) {
            	System.out.println("No VCAP_SERVICES found");
            } else {
                try {
                	JSONObject obj = new JSONObject(vcap);
                    String[] names=JSONObject.getNames(obj);
                    if (names!=null) {
    					for (String name:names) {
                        	if (name.startsWith("DataCache")) { //取得缓存API
                 				JSONArray val = obj.getJSONArray(name);
                 				JSONObject serviceAttr = val.getJSONObject(0);
                 				JSONObject credentials = serviceAttr.getJSONObject("credentials");
                 				username = credentials.getString("username");
                 				password = credentials.getString("password");             							  
                 				endpoint=credentials.getString("catalogEndPoint");
                 				gridName= credentials.getString("gridName");
                 				System.out.println("Found configured username: " + username);
                 				System.out.println("Found configured password: " + password);
                 				System.out.println("Found configured endpoint: " + endpoint);
                 				System.out.println("Found configured gridname: " + gridName);		
                 				foundService = true;
                 				break;
                 			}                                	                                 	                                 	                                         
                        }
    				}
    			} catch(Exception e) {}
     		}
            
     		if(!foundService) {
       			System.out.println("Did not find WXS service, using defaults");
     		}
     		
     		try {
     			
    			ObjectGridManager ogm = ObjectGridManagerFactory.getObjectGridManager();
    			ClientSecurityConfiguration csc=null;
    			csc=ClientSecurityConfigurationFactory.getClientSecurityConfiguration();
    			csc.setCredentialGenerator(new UserPasswordCredentialGenerator(username,password));
    			csc.setSecurityEnabled(true);
    			
    			ClientClusterContext ccc = ogm.connect(endpoint, csc, null);
    	
    			ObjectGrid clientGrid = ogm.getObjectGrid(ccc, gridName);
    			ogSession = clientGrid.getSession();
    			
     		} catch(Exception e) {
     			System.out.println("Failed to connect to grid!");
     			e.printStackTrace();
     		}
    }
    %>
    
    <%
    		try {
    			request.setCharacterEncoding("UTF-8");
    			response.setContentType("text/plain");
    			response.setCharacterEncoding("UTF-8");
    				
    		   ///ObjectMap用来存储缓存内容 
    			ObjectMap map=ogSession.getMap("sample.NONE.P");
    			
    		    String key = request.getParameter("key");			
    			String operation=request.getParameter("operation");
    			Object retrievedValue;
    			if("get".equals(operation)) { 	//取得缓存内容
    			  retrievedValue=map.get(key);
    			  response.getWriter().write(retrievedValue==null?"null":retrievedValue.toString());
    			 
    			} else if("put".equals(operation)) { //存储缓存内容
    			  String newValue = request.getParameter("value");
    			  map.upsert(key,newValue);//能够对map实现update or insert  
    			  response.getWriter().write("[PUT]");
    			  
    			} else if("delete".equals(operation)) { //删除缓存 
    			  map.remove(key);			  
    			  response.getWriter().write("[DELETED]");			  
    			}
    			
    		} catch(Exception e) {
    			System.out.println("Failed to perform operation on map");
    			e.printStackTrace();
    		}
     %>
     

    6、编写前台页面代码

    这里前台使用ajax请求(不懂ajax可看这里Ajax实例解说与技术原理)到dataCache.jsp文件去缓存数据、取数据、删除数据。整个代码例如以下:

    index.html

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>IBM Bluemix缓存实例</title>
    <body  onload="load()">
    <script language="javascript" type="text/javascript">
    function load(){	
      document.getElementById('get').addEventListener("click", getClicked, false);
      document.getElementById('put').addEventListener("click", putClicked, false);
      document.getElementById('delete').addEventListener("click", deleteClicked, false);
    }
    //发送请求
    function sendRequest(operation) {
    	var ajaxRequest;  
    	var key = encodeURIComponent(document.getElementById('key').value);
    	var value = encodeURIComponent(document.getElementById('value').value);
    	
    	ajaxRequest = new XMLHttpRequest();
    	ajaxRequest.onreadystatechange = function(){
    		if(ajaxRequest.readyState == 4){
    			var result = ajaxRequest.responseText;
    			document.getElementById('value').value=result;
            }
    	}
    	//发送ajax的get请求 
    	ajaxRequest.open("GET", "dataCache.jsp?operation="+operation+"&key="+key+"&value="+value, true);
    	ajaxRequest.send(null); 
    }
    //取得缓存
    function getClicked() {
      sendRequest('get');
    }
    //存储缓存
    function putClicked() {
      sendRequest('put');
    }
    //删除缓存
    function deleteClicked() {  
      sendRequest('delete');
    }
    </script>
        <h3>IBM Bluemix缓存实例:</h3> 
    	Key:   <input id="key" type='text' name='key' /> <br>
    	Value:  <input id='value' type="text" name='value' /><br><br>
    	<button id='get'>依据KEY取缓存内容</button>
    	<button id='put'>存储缓存内容</button>
    	<button id='delete'>依据KEY删除缓存内容</button><br>
    	
    </body>
    </html>

    7、本地启动tomcat执行一下


    确认页面显示没问题
    这里你怎样输入数据。点击肯定会出问题,由于还没有部署到Bluxmix:
    例如以下错误:



    三、打包与公布到Bluemix

    1、打包本地war包。
    直接在Eclipse中使用

    然后选择文件夹:

    看看最后的结果:


    注意:也可使用控制台下进行项目文件夹。然后输入
    // 将当前文件夹打包成war包
    jar cvf DataCacheTest.war */ .
    只是,这种方法最后打包的war包笔者上传后启动失败了。

    所以不建议使用这种方法。

    2、上传war包到个人Bluemix中心

    (1)、登陆
    cf login
    输入用户名、密码、选择工作空间
    或者 直接cf login-u ling20081005@126.com -o ling20081005@126.com -s 工作空间名
    邮箱记得换成您自己的。



    (2)、上传war包

    cf push DataCacheTest-p D:DataCacheTest.war -m 512M 
    记得要指定空间大小512M

    最后假设显演示样例如以下:

    说明上传成功且执行成功

    四、验证效果


    输入内容,点击存储缓存内容

    注意。最后显演示样例如以下才表示缓存存储成功,要稍稍等下(server毕竟在美国,速度返回会比較慢),显示put了才表示成功!


    当然,你也能够看日志:
    比方上面的存储缓存的

    日志在这里来看:

    还有就是取缓存的:
    页面上输入key。然后点击取缓存的按钮

    删除缓存:
    页面上输入key,然后点击删除缓存的按钮


    五、监视 IBM Data Cache for Bluemix

    以下是bluxmix提供的用于监视Data Cache的工具


    在将应用程序连接到 Data Cache 之后。您能够监视 Web 应用程序的快速缓存使用情况。单击 IBM Bluemix 仪表板的服务实例,以为您的应用程序显示图表。注意。得绑定服务,并启动程序后才会显示此内容!

    已用空间
    此图表包括基于 IBM 的服务计划的快速缓存容量总计的视图。

    显示的容量总计包括数据网格中存储的数据的 1 个副本。您能够通过为您应用程序购买很多其它容量。一直添加限制。

    吞吐量
    此图表是 5 分钟内吞吐量的快照视图。您能够将此图表展开为更大的视图。显示 1 小时的吞吐量。
    事务时间
    此图表是 5 分钟内事务时间的快照视图。其以每毫秒的事务度量。您能够将此图表展开为更大的视图,显示 1 小时的事务时间。


    命中率
    此图表是快速缓存命中率的快照视图。

    您能够将此图表展开为更大的视图。显示 1 小时的命中率。




    六、遇到的问题

    遇到的问题:
    project第一次上传部署上去的时候。

    尝试訪问部署的应用程序时,打开网址,笔者出现了以下消息:

    404 Not Found:Requested route ('guesstheword.mybluemix.net') does not exist.
    这似乎不正确劲。显然某处存在问题,并且这个问题似乎与在 Bluemix 上执行的应用程序相关,由于该应用程序能够在本地正常执行。

    解决方法:
    删除bluxmix上的project。又一次加入服务。然后又一次打包本地war包(最好通过eclipse 的expot方法)。最后再又一次上传就可以!

  • 相关阅读:
    001:大盗阿福
    1183 编辑距离(51NOD)(dp)
    1134 最长递增子序列(容易TLE)
    1181 质数中的质数(质数筛法)(51NOD基础)
    列表行拖拽效果
    10个提升iOS开发效率的必用工具
    无需转化直接使用ESD映像文件安装系统简明教程
    Objective-C中变量采用@property的各个属性值的含义
    struts接收参数方式
    c# 执行js的方法
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7006934.html
Copyright © 2011-2022 走看看