您的位置:首页 > 数据库 > Redis

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的优化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: