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:[email protected]">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:[email protected]">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:[email protected]">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:[email protected]">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:[email protected]">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:[email protected]">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