基于FLEX,MINA消息推送核心代码

本文介绍了一个基于Apache Mina框架实现的NIO消息推送系统,该系统包括了核心处理类、消息处理器、端口获取工具类等关键组件,并通过Spring框架进行配置管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


import java.util.List;
import java.util.Map;

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;

import com.berheley.bi.grp.nio.messageUtil.IProcessor;
import com.berheley.bi.grp.nio.messageUtil.IWebMessageHelper;
import com.berheley.bi.grp.nio.messageUtil.SocketManager;

/**
*
* 类功能描述:消息推送核心类
*
* @author <a href="mailto:qingyu.meng21@gmail.com">mengqingyu </a>
* @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);

private IWebMessageHelper webMessageHelper;

public IWebMessageHelper getWebMessageHelper() {
return webMessageHelper;
}

public void setWebMessageHelper(IWebMessageHelper webMessageHelper) {
this.webMessageHelper = webMessageHelper;
}

/**
* 接受消息,登陆时执行此方法
*/
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
String msg = message.toString().trim();
if (msg.startsWith("{")) {
String username = JSONObject.fromObject(msg).getString("sd").toString();
SocketManager.getInstance().addUserToOnlineMap(username, session);
List<Map<String,Object>> userList = webMessageHelper.findUserByBinding(username);
if(userList.size()>0){
String jsonMessage = webMessageHelper.changeListToJSONArray(webMessageHelper.findMobileByBinding()).toString();
webMessageHelper.sendMessage(username, jsonMessage, (IProcessor) WebFrameUtils.getBean("webMessage"));
}
}
log.info("<-------------------- Received Message: " + msg + "--------------------->");
}

@Override
public void sessionCreated(IoSession session) throws Exception {
super.sessionCreated(session);
log.info("<--------------------MINA Server Connection Created--------------------->");

}

@Override
public void sessionOpened(IoSession session) throws Exception {
super.sessionOpened(session);
session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 1800); //读写 通道均在1800 秒内无任何操作就进入空闲状态
log.info("<--------------------MINA Server Connection Opened--------------------->");
}

@Override
public void sessionClosed(IoSession session) throws Exception {
this.removeUserBySessionId(session);
session.close(true);
log.info("<--------------------MINA Server Connection Closed--------------------->");
}

@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("<--------------------Session Idle--------------------->");
}

/**
*
* @function:移除在线列表,关闭session
* @param session
* @author: mengqingyu 2013-7-30 下午03:35:22
*/
private void removeUserBySessionId(IoSession session) {
SocketManager.getInstance().removeUserBySessionId(session.getId());
}

}

import java.beans.PropertyEditorSupport;
import java.nio.charset.Charset;

/**
*
* 类功能描述:中文编码
*
* @author <a href="mailto:qingyu.meng21@gmail.com">mengqingyu </a>
* @version $Id: codetemplates.xml,v 1.1 2009/03/06 01:13:01 mengqingyu Exp $
* Create: 2014-1-15 下午01:42:30
*/
public class CharsetEditor extends PropertyEditorSupport {

private Object value;

@Override
public void setAsText(String text) throws IllegalArgumentException {
if (text != null)
this.value = Charset.forName(text);
else
this.value = Charset.forName("UTF-8");
}

@Override
public Object getValue() {
return value;
}
}

import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.webframe.web.util.WebFrameUtils;

/**
*
* 类功能描述:获取端口号
*
* @author <a href="mailto:qingyu.meng21@gmail.com">mengqingyu </a>
* @version $Id: codetemplates.xml,v 1.1 2009/03/06 01:13:01 mengqingyu Exp $
* Create: 2013-7-30 下午03:42:04
*/
public class MinaHelper {

private static final NioSocketAcceptor acc = (NioSocketAcceptor) WebFrameUtils.getBean("ioAcceptor");

public static int getMinaPort() {
return acc.getDefaultLocalAddress().getPort();
}
}

import net.sf.json.JSONObject;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.mina.core.session.IoSession;

import com.berheley.bi.grp.nio.mina.ServerHandler;

/**
*
* 类功能描述:消息处理器抽象类
*
* @author <a href="mailto:qingyu.meng21@gmail.com">mengqingyu </a>
* @version $Id: codetemplates.xml,v 1.1 2009/03/06 01:13:01 mengqingyu Exp $
* Create: 2013-7-30 下午03:52:59
*/
public abstract class AbstractProcessor implements IProcessor {
protected Log log = LogFactory.getLog(ServerHandler.class);

protected SocketManager manager = SocketManager.getInstance();

public abstract void process(JSONObject jsonMessage, IoSession session);
}

import net.sf.json.JSONObject;

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

/**
*
* 类功能描述:统一消息处理接口
*
* @author <a href="mailto:qingyu.meng21@gmail.com">mengqingyu </a>
* @version $Id: codetemplates.xml,v 1.1 2009/03/06 01:13:01 mengqingyu Exp $
* Create: 2014-1-15 下午01:42:02
*/
public interface IProcessor {
/**
*
* @function:统一消息处理接口
* @param jsonMessage
* @param session
* @author: mengqingyu 2013-7-30 下午03:56:10
*/
public void process(JSONObject jsonMessage, IoSession session);
}

import net.sf.json.JSONObject;

import org.apache.mina.core.session.IoSession;
import org.springframework.stereotype.Component;

/**
*
* 类功能描述:消息提醒处理器
*
* @author <a href="mailto:qingyu.meng21@gmail.com">mengqingyu </a>
* @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);
}
}
}
}


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">

<util:properties id="mina" location="classpath:mina.properties"/>

<bean id="ioAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor"
init-method="bind" destroy-method="unbind">
<property name="defaultLocalAddress" value="#{mina['mina.server.port']}" />
<property name="handler" ref="serverHandler" />
<property name="filterChainBuilder" ref="minaFilterChainBuilder" />
</bean>
<!-- NIO处理器 -->
<bean id="serverHandler" class="com.berheley.bi.grp.nio.mina.ServerHandler">
<property name="webMessageHelper" ref="webMessageHelper" />
</bean>

<!-- 构造过滤器链-->
<bean id="minaFilterChainBuilder" class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder">
<property name="filters">
<map>
<entry key="minaloggingFilter" value-ref="minaloggingFilter" />
<entry key="minaProtocolCodecFilter" value-ref="minaProtocolCodecFilter" />
</map>
</property>
</bean>

<!-- 保证TCP协议所有的包发送方的写操作与接受方的读操作一一对应 -->
<bean id="minaProtocolCodecFilter" class="org.apache.mina.filter.codec.ProtocolCodecFilter">
<constructor-arg>
<bean class="org.apache.mina.filter.codec.textline.TextLineCodecFactory">
<constructor-arg index="0" type="java.nio.charset.Charset">
<value>UTF-8</value>
</constructor-arg>
<property name="encoderMaxLineLength" ref="maxValue"></property>
<property name="decoderMaxLineLength" ref="maxValue"></property>
</bean>
</constructor-arg>
</bean>
<util:constant id="maxValue" static-field="java.lang.Integer.MAX_VALUE"/>

<!-- 构造日志过滤器 -->
<bean id="minaloggingFilter" class="org.apache.mina.filter.logging.LoggingFilter" />

<!-- 构造属性编辑器 -->
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="java.net.SocketAddress">
<bean class="org.apache.mina.integration.beans.InetSocketAddressEditor" />
</entry>
<entry key="java.nio.charset.Charset">
<bean class="com.berheley.bi.grp.nio.mina.CharsetEditor" />
</entry>
</map>
</property>
</bean>

</beans>

mina.properties文件内容
mina.server.port=9094
mina.flex.port=840
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值