`
mengqingyu
  • 浏览: 329149 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

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

阅读更多
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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics