springcloud与mina完美结合

来源:互联网 发布:黑暗之魂3世界观知乎 编辑:程序博客网 时间:2024/06/01 08:30



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;@Configurationpublic 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阔以深入研究下,我就不研究了。。。懒大笑大笑大笑


1 0
原创粉丝点击