• OpenFire源码学习之二十:在openfire中使用redis插件(下)


    Redis插件实现

    首先来看下插件目录:


    RedisServicePlugin

    源码清单:

    import java.io.File;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.util.Collection;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.jivesoftware.database.DbConnectionManager;
    import org.jivesoftware.openfire.XMPPServer;
    import org.jivesoftware.openfire.container.Plugin;
    import org.jivesoftware.openfire.container.PluginManager;
    import org.jivesoftware.util.JiveGlobals;
    import org.jivesoftware.util.PropertyEventDispatcher;
    import org.jivesoftware.util.PropertyEventListener;
    import org.jivesoftware.util.redis.enity.RedisConfig;
    import org.jivesoftware.util.redis.enity.User;
    import org.jivesoftware.util.redis.enity.UserVcard;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import redis.clients.jedis.Jedis;
    
    public class RedisServicePlugin implements Plugin, PropertyEventListener{
    	
    	private static final Logger log = LoggerFactory.getLogger(RedisServicePlugin.class);
    	
    	private static final String OF_REDIS_CONFIG_DELETE = "delete from redisConfiguration";
    	private static final String OF_REDIS_CONFIG_INSERT = "INSERT INTO redisConfiguration (name, ip, port, auto) VALUES (?, ?, ?, ?)";
    
    	private XMPPServer server;
    	private boolean enabled;
    	
    	@Override
    	public void propertySet(String property, Map<String, Object> params) {
    		if (property.equals("plugin.redis.enabled")) {
                this.enabled = Boolean.parseBoolean((String)params.get("value"));
            }
    	}
    ......
    	public boolean isEnabled() {
            return enabled;
        }
    	
    	public void setEnabled(boolean enabled) {
            this.enabled = enabled;
            JiveGlobals.setProperty("plugin.redis.enabled",  enabled ? "true" : "false");
        }
    
    	@Override
    	public void initializePlugin(PluginManager manager, File pluginDirectory) {
    		enabled = JiveGlobals.getBooleanProperty("plugin.redis.enabled", true);
    		server = XMPPServer.getInstance();
    		PropertyEventDispatcher.addListener(this);
    	}
    
    	@Override
    	public void destroyPlugin() {
    		enabled = JiveGlobals.getBooleanProperty("plugin.redis.enabled", false);
    		PropertyEventDispatcher.removeListener(this);
    	}
    
    	public void initializeAllData () {
    		Collection<RedisConfig> crcfs = getAllRedisConfig();
    		if (!crcfs.isEmpty()) {
    			for (RedisConfig rcf : crcfs) {
    				if ("REDIS_USER".equals(rcf.getName())) {
    					setRedisByUserInfo();
    				}
    			}
    		}
    	}
    	
    	public void saveRedisConfig(Collection<RedisConfig> object) {
    		PreparedStatement pstmt = null;
    		Connection con = null;
    		try {
    			con = (Connection) DbConnectionManager.getConnection();
    			if (object != null) {
    				pstmt = con.prepareStatement(OF_REDIS_CONFIG_DELETE);
    				pstmt.execute();
    				pstmt = (PreparedStatement) con.prepareStatement(OF_REDIS_CONFIG_INSERT);
    				for (RedisConfig cr : object) {
    					pstmt.setString(1, cr.getName());
    					pstmt.setString(2, cr.getIp());
    					pstmt.setString(3, cr.getPort());
    					pstmt.setString(4, cr.getAuto());
    					pstmt.executeUpdate();
    				}
    			}
    		} catch (Exception e) {
    			 log.info(e.getMessage());
    			 e.printStackTrace();
    		}
    		finally {
    			 DbConnectionManager.closeConnection(pstmt, con);
    		}
    	}
    	
    	public Collection<RedisConfig> getAllRedisConfig() {
    		if (server == null)
    			server = XMPPServer.getInstance();
    		return server.getJedisConfDao().getAllRedisConfig();
    	}
    	
    	public void setRedisOfflineMessage() {
    		XMPPServer.getInstance().getChatMessageJedisPoolManager().initDataByOfflineMessage();
    	}
    	
    	public void destroyOfflineMessage() {
    		Jedis jedis = server.getChatMessageJedisPoolManager().getJedis();
    		jedis.flushDB();
    		server.getChatMessageJedisPoolManager().returnRes(jedis);
    	}
    	
    	public void setRedisUserSearch() {
    		XMPPServer.getInstance().getRedisSearchManager().createSearchAllUserData();
    	}
    	
    	public void destroyUserSearch() {
    		Jedis jedis = server.getRedisSearchManager().getSearchJedis();
    		jedis.flushDB();
    		XMPPServer.getInstance().getUserJedis().returnRes(jedis);
    	}
    	
    	public void destroyRedisByUserInfo () {
    		Jedis jedis = server.getUserJedis().getJedis();
    		Map<String, String > user = jedis.hgetAll("OFUSER:admin");
    		jedis.flushAll();
    		jedis.hmset("OFUSER:admin", user);
    		XMPPServer.getInstance().getUserJedis().returnRes(jedis);
    	}
    	
    	public void setRedisByUserInfo () {
    		Jedis jedis = server.getUserJedis().getJedis();
    		int i = 1;
    		
    		Collection<User> users = server.getUserJedis().getAllUser();
    		if (!users.isEmpty()) {
    			for (User user : users) {
    				Map<String,String> map = new HashMap<String, String>();
    				map.put("PASSWORD", user.getPassword());
    				if (user.getName() != null )
    					map.put("NAME", user.getName());
    				if (user.getMoblie() != null )
    					map.put("MOBILE", user.getMoblie().trim());
    				if (user.getEmail() != null)
    					map.put("EMAIL", user.getEmail().trim());
    				map.put("CREATIONDATE",user.getCreationDate().trim());
    				map.put("MODIFICATIONDATE",user.getModificationDate().trim());
    				jedis.hmset("OFUSER:" + user.getUsername(), map);
    				
    				System.out.println("The " + i++ + "user generation=> username:" + user.getUsername() + ", name:" + user.getName());
    			}
    			System.out.println("the end:user base info generated...");
    			i = 1;
    			
    			for (User user : users) {
    				if (user.getMoblie() != null && !"".equals(user.getMoblie())) {
    					jedis.set("MOBILE:" + user.getMoblie(), user.getUsername());
    					System.out.println("The" + i++ + "user,mobile relation generation=> mobile:" + user.getMoblie() + ", username:" + user.getUsername());
    				}
    			}
    			System.out.println("the end:user and mobile relation generated...");
    			i = 1;
    		}
    		
    		Collection<UserVcard> uservcards = server.getUserJedis().getUserVcard();
    		if (!uservcards.isEmpty()) {
    			for (UserVcard uv : uservcards) {
    				if (uv.getVcard() != null && !"".equals(uv.getVcard())) {
    					jedis.set("OFVCARD:" + uv.getUsername(), uv.getVcard());
    					System.out.println("The" + i++ + "user vcard generation=> username:" + uv.getUsername());
    				}
    			}
    			i = 1;
    			System.out.println("the end:user vcard generated...");
     		}
    		
    		server.getUserJedis().returnRes(jedis);
    	}
    }
    

    RedisUserInfoOpt:

    import java.util.HashMap;
    import java.util.Map;
    
    import org.jivesoftware.openfire.XMPPServer;
    import org.jivesoftware.util.redis.enity.User;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import redis.clients.jedis.Jedis;
    
    public class RedisUserInfoOpt {
    
    	private static final Logger Log = LoggerFactory.getLogger(RedisUserInfoOpt.class);
    	
    	public void setBaseUserInfo(User user) {
    		if (user != null) {
    			Jedis jedis = XMPPServer.getInstance().getUserJedis().getJedis();
    			
    			try {
    				Map<String,String> map = new HashMap<String, String>();
    				map.put("PASSWORD", user.getPassword());
    				if (user.getName() != null )
    					map.put("NAME", user.getName());
    				if (user.getMoblie() != null )
    					map.put("MOBILE", user.getMoblie().trim());
    				if (user.getEmail() != null)
    					map.put("EMAIL", user.getEmail().trim());
    				map.put("CREATIONDATE",user.getCreationDate().trim());
    				map.put("MODIFICATIONDATE",user.getModificationDate().trim());
    				jedis.hmset("OFUSER:" + user.getUsername(), map);
    				Log.info("user generation=> username:" + user.getUsername() + ", name:" + user.getName());
    			} finally{
    				XMPPServer.getInstance().getUserJedis().returnRes(jedis);
    			}
    		}
    	}
    	
    	public void setUserMobile(User user) {
    		if (user != null) {
    			Jedis jedis = XMPPServer.getInstance().getUserJedis().getJedis();
    			try {
    				
    			} finally {
    				XMPPServer.getInstance().getUserJedis().returnRes(jedis);
    			}
    			
    		}
    	}
    }
    

    redis-service.jsp

    <%@ page import="java.util.*,
                     org.jivesoftware.openfire.XMPPServer,
                     org.jivesoftware.util.*,
                     com.montnets.redis.plugin.RedisServicePlugin,
                     org.jivesoftware.util.redis.enity.RedisConfig"
        errorPage="error.jsp"
    %>
    
    <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
    <%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt" %>
    
    <%-- Define Administration Bean --%>
    <jsp:useBean id="admin" class="org.jivesoftware.util.WebManager"  />
    <c:set var="admin" value="${admin.manager}" />
    <% admin.init(request, response, session, application, out ); %>
    
    <%  // Get parameters
        boolean save = request.getParameter("save") != null;
    	String initdata = request.getParameter("initdata");
    	String deldata = request.getParameter("deldata");
        boolean success = request.getParameter("success") != null;
        RedisServicePlugin rsp = new RedisServicePlugin();
        Collection<RedisConfig> rcList = rsp.getAllRedisConfig();
        
        // Handle a save
        Map errors = new HashMap();
        Collection<RedisConfig> rcColl = new ArrayList<RedisConfig>();
    	
        if ("REDIS_USER".equals(initdata)) {
        	rsp.initializeAllData();
            response.sendRedirect("redis-service.jsp?success=true");
            return;
        }
        else if ("REDIS_USER".equals(deldata)) {
        	rsp.destroyRedisByUserInfo();
        	response.sendRedirect("redis-service.jsp?success=true");
            return;
        }
        ......
        if (save) {
        	String uname = request.getParameter("REDIS_USER");
        	String r_user_name = request.getParameter("REDIS_USER_IP").trim();
        	String r_user_port = request.getParameter("REDIS_USER_PORT").trim();
        	String r_user_auto = request.getParameter("REDIS_USER_AUTO").trim();
        	if (r_user_name == null || r_user_port == null) {
        		errors.put("uname", "Redis-User is error!");
        	}
        	else {
        		RedisConfig rc = new RedisConfig();
            	rc.setName(uname);
            	rc.setIp(r_user_name);
            	rc.setPort(r_user_port);
            	rc.setAuto(r_user_auto);
            	rcColl.add(rc);
        	}
        	......
        	String mmname = request.getParameter("REDIS_MUC_MESSAGE");
        	String r_mm_name = request.getParameter("REDIS_MUC_MESSAGE_IP").trim();
        	String r_mm_port = request.getParameter("REDIS_MUC_MESSAGE_PORT").trim();
        	String r_mm_auto = request.getParameter("REDIS_MUC_MESSAGE_AUTO").trim();
        	if (r_mm_name == "" || r_mm_port == "") {
        		errors.put("mname", "Redis-MUC MESSAGE is error!");
        	}
        	else {
        		RedisConfig rc = new RedisConfig();
            	rc.setName(mmname);
            	rc.setIp(r_mm_name);
            	rc.setPort(r_mm_port);
            	rc.setAuto(r_mm_auto);
            	rcColl.add(rc);
        	}
        	
        	String omname = request.getParameter("REDIS_OFFLINE_MESSAGE");
        	......
            if (errors.size() == 0) {
            	rsp.saveRedisConfig(rcColl);
                response.sendRedirect("redis-service.jsp?success=true");
                return;
            }
        }
        
    %>
    
    <html>
        <head>
            <title>Redis Service Properties</title>
            <meta name="pageID" content="redis-service"/>
        </head>
        <body>
    <%  if (!errors.isEmpty()) { %>
    
        <div class="jive-error">
        <table cellpadding="0" cellspacing="0" border="0">
        <tbody>
            <tr>
                <td class="jive-icon"><img src="images/error-16x16.gif" width="16" height="16" border="0" alt=""/></td>
                <td class="jive-icon-label">
    
                <% if (errors.get("uname") != null) { %>
                    <%=errors.get("uname") %>
                <% } else if (errors.get("gname") != null) { %>
                    <%=errors.get("gname") %>
                <% } else if (errors.get("rname") != null) { %>
                    <%=errors.get("rname") %>
                <% } else if (errors.get("mname") != null) { %>
                    <%=errors.get("mname") %>
                <% } else if (errors.get("mmname") != null) { %>
                    <%=errors.get("mmname") %>
                <% } else if (errors.get("omname") != null) { %>
                    <%=errors.get("omname") %>
                <% } else if (errors.get("cmname") != null) { %>
                    <%=errors.get("cmname") %>
                <% } %>
                </td>
            </tr>
        </tbody>
        </table>
        </div><br>
    
    <%  } %>
    
    <p>
    This is redis plugin
    </p>
    
    <%  if (success) { %>
    
        <div class="jive-success">
        <table cellpadding="0" cellspacing="0" border="0">
        <tbody>
            <tr><td class="jive-icon"><img src="images/success-16x16.gif" width="16" height="16" border="0"></td>
            <td class="jive-icon-label">
                redis service properties edited successfully.
            </td></tr>
        </tbody>
        </table>
        </div><br>
    <% } %>
    
    <form action="redis-service.jsp?save=true" method="post">
    
    <fieldset>
        <legend>Redis Service</legend>
        <div>
        <ul>
        <%if (rcList.size() < 1) { %>
            <label for="r_user">REDIS_USER:</label>
    		<input type="hidden" id="r_user_name" name="REDIS_USER" value="REDIS_USER"/>
            <input type="text" id="r_user_ip" name="REDIS_USER_IP" size="20" value=""/>
    		<label for="r_port">port:</label>
    		<input type="text" id="r_user_port" name="REDIS_USER_PORT" size="5" value=""/>
    		<label for="r_auto">auto:</label>
    		<input type="text" name="REDIS_USER_AUTO" size="10" value=""/>
    		<br><br>
    		
    		<label for="r_user">REDIS_GROUP:</label>
    		<input type="hidden" id="r_group_name" name="REDIS_GROUP" value="REDIS_GROUP"/>
            <input type="text" id="r_group_ip" name="REDIS_GROUP_IP" size="20" value=""/>
            <label for="r_port">port:</label>
    		<input type="text" id="r_group_port" name="REDIS_GROUP_PORT" size="5" value=""/>
    		<label for="r_auto">auto:</label>
    		<input type="text" name="REDIS_GROUP_AUTO" size="10" value=""/>
    		<br><br>
    		
    		<label for="r_user">REDIS_ROSTER:</label>
    		<input type="hidden" id="r_roster_name" name="REDIS_ROSTER" value="REDIS_ROSTER"/>
            <input type="text" id="r_roster_ip" name="REDIS_ROSTER_IP" size="20" value=""/>
            <label for="r_port">port:</label>
    		<input type="text" id="r_roster_port" name="REDIS_ROSTER_PORT" size="5" value=""/>
    		<label for="r_auto">auto:</label>
    		<input type="text" name="REDIS_ROSTER_AUTO" size="10" value=""/>
    		<br><br>
    		
    		<label for="r_user">REDIS_MUC:</label>
    		<input type="hidden" id="r_muc_name" name="REDIS_MUC" value="REDIS_MUC"/>
            <input type="text" id="r_muc_ip" name="REDIS_MUC_IP" size="20" value=""/>
            <label for="r_port">port:</label>
    		<input type="text" id="r_muc_port" name="REDIS_MUC_PORT" size="5" value=""/>
    		<label for="r_auto">auto:</label>
    		<input type="text" name="REDIS_MUC_AUTO" size="10" value=""/>
    		<br><br>
    		
    		<label for="r_user">REDIS_MUC_MESSAGE:</label>
    		<input type="hidden" id="r_mm_name" name="REDIS_MUC_MESSAGE" value="REDIS_MUC_MESSAGE"/>
            <input type="text" id="r_mm_ip" name="REDIS_MUC_MESSAGE_IP" size="20" value=""/>
            <label for="r_port">port:</label>
    		<input type="text" id="r_mm_port" name="REDIS_MUC_MESSAGE_PORT" size="5" value=""/>
    		<label for="r_auto">auto:</label>
    		<input type="text" name="REDIS_MUC_MESSAGE_AUTO" size="10" value=""/>
    		<br><br>
    		
    		<label for="r_user">REDIS_OFFLINE_MESSAGE:</label>
    		<input type="hidden" id="r_om_name" name="REDIS_OFFLINE_MESSAGE" value="REDIS_OFFLINE_MESSAGE"/>
            <input type="text" id="r_om_ip" name="REDIS_OFFLINE_MESSAGE_IP" size="20" value=""/>
            <label for="r_port">port:</label>
    		<input type="text" id="r_om_port" name="REDIS_OFFLINE_MESSAGE_PORT" size="5" value=""/>
    		<label for="r_auto">auto:</label>
    		<input type="text" name="REDIS_OFFLINE_MESSAGE_AUTO" size="10" value=""/>
    		<br><br>
    		
    		<label for="r_user">REDIS_CHAT_MESSAGE:</label>
    		<input type="hidden" id="r_cm_name" name="REDIS_CHAT_MESSAGE" value="REDIS_CHAT_MESSAGE"/>
            <input type="text" id="r_cm_ip" name="REDIS_CHAT_MESSAGE_IP" size="20" value=""/>
            <label for="r_port">port:</label>
    		<input type="text" id="r_cm_port" name="REDIS_CHAT_MESSAGE_PORT" size="5" value=""/>
    		<label for="r_auto">auto:</label>
    		<input type="text" name="REDIS_CHAT_MESSAGE_AUTO" size="10" value=""/>
    		<br><br>
    		
    		<label for="r_user">REDIS_SEARCH:</label>
    		<input type="hidden" id="r_rs_name" name="REDIS_SEARCH" value="REDIS_SEARCH"/>
            <input type="text" id="r_rs_ip" name="REDIS_SEARCH_IP" size="20" value=""/>
            <label for="r_port">port:</label>
    		<input type="text" id="r_rs_port" name="REDIS_SEARCH_PORT" size="5" value=""/>
    		<label for="r_auto">auto:</label>
    		<input type="text" name="REDIS_SEARCH_AUTO" size="10" value=""/>
    		<br><br>
    		
    		<% } %>
    		<% if (rcList.size() >= 1) { %>
    			<% for (RedisConfig cr : rcList) { %>
    				<label for="r_user"><%=cr.getName() %></label>
    				<input type="hidden" name="<%=cr.getName() %>" value="<%=cr.getName() %>"/>
            		<input type="text" name="<%=cr.getName() %>_IP" size="20" value="<%=cr.getIp() %>"/>
            		<label for="r_port">port:</label>
    				<input type="text" name="<%=cr.getName() %>_PORT" size="5" value="<%=cr.getPort() %>"/>
    				<label for="r_auto">auto:</label>
    				<input type="text" name="<%=cr.getName() %>_AUTO" size="10" value="<%=cr.getAuto() %>"/>
    				<br>
    				<input type="button" value="initialize data" onclick="window.location.href='redis-service.jsp?initdata=<%=cr.getName() %>'; return false;"/>
    				<input type="button" value="destroy data" onclick="window.location.href='redis-service.jsp?deldata=<%=cr.getName() %>'; return false;"/>
    				<br><br>
    			<%} %>
    		<% } %>
        </ul>
        </div>
    </fieldset>
    
    <br><br>
    
    <input type="submit" value="Save Settings">
    <input type="hidden" name="initdata" value=""/>
    </form>
    
    </body>
    </html>
    

    Plugin.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <plugin>
        <class>com.montnets.redis.plugin.RedisServicePlugin</class>
        <name>Redis Service</name>
        <description>Redis distributed cache</description>
        <author>HuWenFeng</author>
        <version>1.3.3</version>
        <date>17/1/2014</date>
        <minServerVersion>3.8.2</minServerVersion>
        
        <adminconsole>		
            <tab id="tab-redis"  name="Redis"  url="redis-service.jsp">
                <sidebar id="sidebar-redis-settings"  name="Redis Service" >
                    <item id="redis-service" name="Redis Service" url="redis-service.jsp"
                         description="Redis distributed cache" />
                </sidebar>
            </tab>
        </adminconsole>
    </plugin>
    

    这里只简单贴出了用户这类的相关数据的预加载。

    下面开始具体讲讲基于Redis数据的几大分类。这里这里主要拿用户和消息这两大块具体来说说openfire基于redis的优化。

  • 相关阅读:
    Python学习 5day__基础知识
    pycharm 2018.1 专业版激活 亲测可用!!!
    JQuery 中 find() 和 filter() 的区别
    React 事件处理
    React 数据传递
    js操作cookie的一些注意项
    html5的技术要点
    css背景设置,让套图中某张图片居中显示的例子
    js对象封装内部图片的相关代码,采用base64图片串
    针对网上很多抱怨的言论,写了一个EF中update对象时,通用的遍历赋值方法,以供参考
  • 原文地址:https://www.cnblogs.com/huwf/p/4273348.html
Copyright © 2020-2023  润新知