springcloud与mina完美结合

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaonuo717/article/details/56015948



Mina 开发高性能和高可用性的网络应用程序的通讯框架。


Mina 特点:

         1.基于Java NIO类库

           2.非阻塞方式的异步传输

           3.spring完美结合

           4.依赖apache

           5.灵活的配置过滤器

         6.....

Mina 流程:

       ------------------------------------------->

       IoHandler(负责接收和处理数据)

       ------->  IoFilter(一系列灵活可控的过滤器,例如 日志过滤器,编码过滤器)

       -------> IoAcceptor

       ------->  IoService(建立套接字,监听)

       ------------------------------------------->


Mina 实战:

     

package cn.xyd.job.gateway.mina;

import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.log4j.Logger;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.service.IoHandler;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class MinaConfig {
		
	    private Logger log = Logger.getLogger(MinaConfig.class);
	  
		private final int  SOCKET_PORT = 9999;
		
    	    @Bean
	    public LoggingFilter loggingFilter() {
	        return new LoggingFilter();
	    }
    	
	    @Bean
	    public IoHandler ioHandler() {
	        return new SocketServerHandler();
	    }
	    
	    @Bean
	    public InetSocketAddress inetSocketAddress() {
	        return new InetSocketAddress(SOCKET_PORT);
	    } 
	    
	    @Bean
	    public IoAcceptor ioAcceptor() throws Exception {
	    	log.info("正在启动socket服务端。。。。");
	    //监听传入 连接的对象
	    IoAcceptor acceptor=new NioSocketAcceptor();
	    //记录所有的信息,比如创建session(会话),接收消息,发送消息,关闭会话等 
	    acceptor.getFilterChain().addLast( "logger", loggingFilter() );
	    	//ProtocolCodecFilter(协议编解码过滤器).这个过滤器用来转换二进制或协议的专用数据到消息对象中
	        acceptor.getFilterChain().addLast( "codec",
	        		new ProtocolCodecFilter(
	        				new TextLineCodecFactory(Charset.forName("UTF-8"))));
	        
	        //创建一个handler来实时处理客户端的连接和请求,这个handler 类必须实现 IoHandler这个接口。
	        acceptor.setHandler(ioHandler());

	        //设置读写缓冲区大小
	        acceptor.getSessionConfig().setReadBufferSize( 2048 );
	        //空闲时间   通道均在10 秒内无任何操作就进入空闲状态
	        acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );


	        acceptor.bind(inetSocketAddress());
	        log.info("socket 服务端 已经启动。。。。");
	        return acceptor;
	    }
	   
}



package cn.ccb.xyd.job.gateway.mina;

import java.net.InetSocketAddress;

import org.apache.mina.core.service.IoHandler;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.transport.socket.SocketSessionConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import cn.ccb.xyd.job.common.common.ErrorCode;
import cn.ccb.xyd.job.common.exception.BizException;
import cn.ccb.xyd.job.gateway.core.InvokeService;

//import com.example.zuul.Application;
//import com.example.zuul.core.InvokeService;

public class SocketServerHandler  implements IoHandler {
    
    private static Logger log = LoggerFactory.getLogger(SocketServerHandler.class);
    
    
    
    @Autowired
    private InvokeService invokeService;
    
    
    
    @Override
    public void sessionCreated(IoSession session) throws Exception {
        //在socket连接时,获取客户端的iP
        String clientIP = ((InetSocketAddress)session.getRemoteAddress()).getAddress().getHostAddress();  
        //session.setAttribute("KEY_SESSION_CLIENT_IP", clientIP);  
        log.info("session创建,客户端 IP: " + clientIP);  
        //SocketSessionConfig cfg = (SocketSessionConfig) session.getConfig();
        //mina在请求后直接 调用close();不会再进入TIME_WAIT状态,而是直接close();
       // cfg.setSoLinger(0);
        
    }

    @Override
    public void sessionOpened(IoSession session) throws Exception {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void sessionClosed(IoSession session) throws Exception {
        // TODO Auto-generated method stub
        
    }
    
    //空闲状态时,将定时调用一次会话
    @Override
    public void sessionIdle(IoSession session, IdleStatus status)
            throws Exception {
        // TODO Auto-generated method stub
        
    }
    
     //exceptionCaught 应该总是在handler 中定义,来处理一些异常情况,否则异常信息将无法捕捉。
    //exceptionCaught 方法简单地打印了错误的堆栈跟踪和关闭会话。
    //对于大多数程序,这将是标准的做法,除非处理程序可以从异常状态中恢复。
    @Override
    public void exceptionCaught(IoSession session, Throwable cause)
            throws Exception {
        log.info(cause.getMessage());
        session.close();
        
    }
    
    
    //messageReceived 方法来处理从客户端接收到的数据
    // 根据所使用的协议编解码器,object 这个参数传递的类型有所不同,以及返回的数据时的session.write(Object) 也不同。
    // 如果不指定协议的编解码器,你将收到一个类型为IoBuffer 的对象,返回的数据也要求是IoBuffer。
    @Override
    public void messageReceived(IoSession session, Object message)
            throws Exception {
        String msg = message.toString();
        if("quit".equals(msg)){
            session.close();
        }
        log.info("socket server接收报文:{}", msg);
        String retMsg = null;
        log.info("invokeService"+invokeService);
        try {
            retMsg = invokeService.request("sendMessage?msg="+msg,String.class);
        } catch (Exception e) {
            new BizException(ErrorCode.ERROR_002);
            retMsg  = ErrorCode.ERROR_002;
        }
        log.info("socket server返回报文:{}", retMsg);
        session.write(retMsg);
    }

    @Override
    public void messageSent(IoSession session, Object message) throws Exception {
        // TODO Auto-generated method stub
        
    }

}




 

            <!-- mina配置 -->
		<dependency>
			<groupId>org.apache.mina</groupId>
			<artifactId>mina-core</artifactId>
			<version>2.0.4</version>
		</dependency>

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
		</dependency>

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-nop</artifactId>
			<version>1.6.1</version>
		</dependency>
		<!-- END -->



Ps:iosession阔以深入研究下,我就不研究了。。。懒大笑大笑大笑


没有更多推荐了,返回首页