OpenFire源码学习之二十:在openfire中使用redis插件(下)
2018-02-05 10:55
453 查看
Redis插件实现
首先来看下插件目录:RedisServicePlugin
源码清单:
[java] view
plain copy
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:
[java] view
plain copy
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
[html] view
plain copy
<%@ 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
[html] view
plain copy
<?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的优化。
相关文章推荐
- OpenFire源码学习之二十:在openfire中使用redis插件(下)
- OpenFire源码学习之三十二:使用Tsung测试openfire(下)
- OpenFire源码学习之十九:在openfire中使用redis插件(上)
- OpenFire源码学习之十四:插件管理
- OpenFire源码学习之十九:在openfire中使用redis插件(上)
- OpenFire源码学习之十九:在openfire中使用redis插件(上)
- OpenFire源码学习之十七:HTTP Service插件
- OpenFire源码学习之三十一:使用Tsung测试openfire(上)
- (转)OpenFire源码学习之十四:插件管理
- OpenFire源码学习之二十:在openfire中使用redis插件(下)
- OpenFire源码学习之十四:插件管理
- OpenFire源码学习之三十一:使用Tsung测试openfire(上)
- OpenFire源码学习之二十:在openfire中使用redis插件(下)
- OpenFire源码学习之三十一:使用Tsung测试openfire(上)
- OpenFire源码学习之三十二:使用Tsung测试openfire(下)
- OpenFire源码学习之十七:HTTP Service插件
- OpenFire源码学习之十四:插件管理
- OpenFire源码学习之十九:在openfire中使用redis插件(上)
- (转)OpenFire源码学习之十七:HTTP Service插件
- OpenFire源码学习之十四:插件管理