java mina 推送_MINA 消息推送核心代码

class="java">import net.sf.json.JSONObject;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.apache.mina.core.service.IoHandlerAdapter;

import org.apache.mina.core.session.IdleStatus;

import org.apache.mina.core.session.IoSession;

import org.webframe.web.util.WebFrameUtils;

/**

*

* 类功能描述:消息推送核心类

*

* @author mengqingyu

* @version $Id: codetemplates.xml,v 1.1 2009/03/06 01:13:01 mengqingyu Exp $

* Create: 2013-7-30 下午03:35:40

*/

public class ServerHandler extends IoHandlerAdapter {

private Log log = LogFactory.getLog(ServerHandler.class);

/**

* 接受消息,登陆时执行此方法

*/

public void messageReceived(IoSession session, Object message) throws Exception {

String msg = message.toString().trim();

if (msg.startsWith("{")) {

JSONObject jsonMessage = JSONObject.fromObject(msg);

IProcessor processor = (IProcessor) WebFrameUtils.getBean(jsonMessage.getString("ty"));

processor.process(jsonMessage, session);

}

log.info("");

}

@Override

public void sessionCreated(IoSession session) throws Exception {

super.sessionCreated(session);

log.info("");

}

@Override

public void sessionOpened(IoSession session) throws Exception {

super.sessionOpened(session);

session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 1); //读写 通道均在1800 秒内无任何操作就进入空闲状态

log.info("");

}

@Override

public void sessionClosed(IoSession session) throws Exception {

//this.removeUserBySessionId(session);

session.close(true);

log.info("");

}

@Override

public void exceptionCaught(IoSession session, Throwable cause) throws Exception {

this.removeUserBySessionId(session);

session.close(true);

log.info("Session Id: " + session.getId() + "" + cause.getMessage());

log.error(cause);

}

/**

* 超出空闲时间执行

*/

@Override

public void sessionIdle(IoSession session, IdleStatus status) throws Exception {

this.removeUserBySessionId(session);

session.close(true);

log.info("");

}

/**

*

* @function:移除在线列表,关闭session

* @param session

* @author: mengqingyu 2013-7-30 下午03:35:22

*/

private void removeUserBySessionId(IoSession session) {

SocketManager.getInstance().removeUserBySessionId(session.getId());

}

}

import java.net.InetSocketAddress;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Date;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.apache.mina.core.session.IoSession;

/**

*

* 类功能描述:在线用户管理工具类

*

* @author tangtaibin

* @version $Id: SocketManager.java,v 1.18 2011/01/26 08:18:49 tangtaibin Exp $

* Create: 2010-10-19 下午02:29:31

*/

public class SocketManager {

private Log log = LogFactory.getLog(SocketManager.class);

public static final String USER_HOST = "host";

public static final String USER_LOGIN_TIME = "logintime";

public static final String SESSION_ID = "sessionId";

public static final String MESSAGE_END = "@$$@";

private static final SocketManager manager = new SocketManager();

private final Map online = new HashMap();

private SocketManager() {

}

public static SocketManager getInstance() {

return manager;

}

public Map getOnline() {

return online;

}

/**

*

* @function:添加用户信息到在线用户列表

* @param username

* @param session

* @param moduleName

* @author: mengqingyu 2013-7-30 下午03:38:47

*/

public void addUserToOnlineMap(String username, IoSession session, String moduleName) {

InetSocketAddress remoteAddress = (InetSocketAddress) session.getRemoteAddress();

session.setAttribute(SESSION_ID, session.getId());

session.setAttribute(USER_HOST, remoteAddress.getAddress().getHostAddress());

session.setAttribute(USER_LOGIN_TIME, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));

session.setAttribute("userId", username);

this.online.put(username, session);

}

/**

*

* @function:从在线用户列表删除用户信息

* @param username

* @author: mengqingyu 2013-7-30 下午03:38:38

*/

public void removeUserFromOnlineMap(String username) {

IoSession session = (IoSession) this.online.get(username);

this.online.remove(username);

session.close(true);

}

/**

*

* @function:根据sessionId删除用户

* @param sessionId

* @author: mengqingyu 2013-7-30 下午03:38:10

*/

public void removeUserBySessionId(long sessionId) {

for(Entry entry:online.entrySet()){

String username = entry.getKey();

IoSession session = entry.getValue();

if (sessionId == (Long)session.getAttribute(SESSION_ID)) {

log.info("Exception from " + sessionId + " " + username + " is connected:" + session.isConnected());

this.removeUserFromOnlineMap(username);

break;

}

}

}

/**

* 获取在线用户列表

*

* @function:

* @return

* @author: tangtaibin 2010-10-19 下午02:31:06

*/

public List getOnlineUsers() {

Set keySet = this.online.keySet();

return new ArrayList(keySet);

}

/**

* 获取用户Session

*

* @function:

* @param userid

* @return

* @author: liujuan 2011-1-7 上午09:08:16

*/

public IoSession getUserSession(String username) {

return this.online.get(username);

}

/**

* 给某个用户发送消息

*

* @function:

* @param userid

* @param msg

* @author: tangtaibin 2010-10-19 下午02:31:25

*/

public synchronized void sendToUser(String username, String msg) {

IoSession session = this.online.get(username);

log.info("MSG To: " + msg);

try {

session.write(msg + MESSAGE_END);

log.info("MSG: " + msg);

} catch (Exception e) {

log.error(e);

}

}

}

import java.util.List;

import java.util.Map;

import net.sf.json.JSONObject;

import org.apache.mina.core.session.IoSession;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import org.webframe.web.util.WebFrameUtils;

import com.berheley.bi.basic.exp.BusinessException;

import com.berheley.bi.basic.timer.ITimerJob;

import com.berheley.oa.nio.AbstractProcessor;

import com.berheley.yq.common.IMonitorService;

/**

*

* 类功能描述:用户登陆处理类

*

* @author mengqingyu

* @version $Id: codetemplates.xml,v 1.1 2009/03/06 01:13:01 mengqingyu Exp $

* Create: 2013-7-30 下午03:41:22

*/

@Component("webMessage_login")

public class LoginProcessor extends AbstractProcessor {

@Autowired

IMonitorService monitorService;

@Override

public void process(JSONObject jsonMessage, IoSession session) {

// 用户登陆

final String username = jsonMessage.getString("sd");

log.info("【用户已登录username:】" + username);

IoSession ioSession = manager.getUserSession(username);

// 将用户加入在线用户列表

manager.addUserToOnlineMap(username, session, "webMessge");

if(ioSession == null){

List> beanNames = monitorService.getBeanNames();

for(Map beanName:beanNames){

ITimerJob timerJob = (ITimerJob)WebFrameUtils.getBean(beanName.get("beanName").toString());

beanName.put("currentUser", username);

try {

timerJob.jtaTimerExecute(null, beanName);

} catch (BusinessException e) {

e.printStackTrace();

log.error("登陆时消息提醒错误:"+e.getMessage());

}

}

}

}

}

import net.sf.json.JSONObject;

import org.apache.mina.core.session.IoSession;

import org.springframework.stereotype.Component;

import com.berheley.oa.nio.AbstractProcessor;

/**

*

* 类功能描述:消息提醒处理器

*

* @author mengqingyu

* @version $Id: codetemplates.xml,v 1.1 2009/03/06 01:13:01 mengqingyu Exp $

* Create: 2013-7-3 下午04:04:50

*/

@Component("webMessage")

public class WebMessageProcessor extends AbstractProcessor {

@Override

public void process(JSONObject jsonMessage, IoSession session) {

if (jsonMessage != null) {

IoSession userSession = manager.getUserSession(jsonMessage.getString("sender"));

if (userSession != null) {

userSession.write(jsonMessage);

log.info("***********************【页面提醒】:" + jsonMessage);

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值