apache mina-mina 线程不知什么原因死了

问题描述

mina 线程不知什么原因死了

mina 写的客户端,在两台机器运行没有错误,这两台是有线网络,到第三台机器时不时线程就死了,第三台为无线网络,网络不稳定,但是已经加入了重连机制,目前在本地无法模拟出这种情况,大神可以看看是什么问题吗

@Service
public class MinaClient implements InitializingBean {

final Logger logger = Logger.getLogger(MinaClient.class);

private IoSession session;

private NioSocketConnector connector;

private int parkId;

public void start() throws IOException {
    // 读取配置文件停车场Id
    Properties prop = ConfUtils.loadConf(Constants.PROPERTIES_URL);
    parkId = Integer.parseInt(prop.getProperty("parkId"));
    String[] address = prop.getProperty("minaremoteaddress").split(":");

    String host = address[0];
    int port = Integer.parseInt(address[1]);

    connector = new NioSocketConnector();
    // connector.getFilterChain().addLast( "logger", new LoggingFilter() );

    connector.setConnectTimeoutMillis(10000);

    connector.getFilterChain().addLast("mdc", new MdcInjectionFilter());
    TextLineCodecFactory factory = new TextLineCodecFactory(
            Charset.forName("UTF-8"));

    factory.setDecoderMaxLineLength(10240);
    factory.setEncoderMaxLineLength(10240);
    // 加入解码器
    connector.getFilterChain().addLast("codec",
            new ProtocolCodecFilter(factory));

    connector.getSessionConfig().setReceiveBufferSize(10240); // 设置接收缓冲区的大小
    connector.getSessionConfig().setSendBufferSize(10240);// 设置输出缓冲区的大小

    connector.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 30); // 读写都空闲时间:30秒
    connector.getSessionConfig().setIdleTime(IdleStatus.READER_IDLE, 40);// 读(接收通道)空闲时间:40秒
    connector.getSessionConfig().setIdleTime(IdleStatus.WRITER_IDLE, 50);// 写(发送通道)空闲时间:50秒

    /** mina 心跳机制 */

    KeepAliveMessageFactory heartBeatFactory = new KeepAliveMessageFactoryImpl();
    KeepAliveFilter heartBeat = new KeepAliveFilter(heartBeatFactory,
            IdleStatus.READER_IDLE, KeepAliveRequestTimeoutHandler.CLOSE);
    /** 是否回发 */
    heartBeat.setForwardEvent(false);
    /** 发送频率 */
    heartBeat.setRequestInterval(10);
    heartBeat.setRequestTimeout(5);
    connector.getSessionConfig().setKeepAlive(true);
    connector.getFilterChain().addLast("heartbeat", heartBeat);

    // 添加处理器
    connector.setHandler(new MinaClientHandler());
    connector.setDefaultRemoteAddress(new InetSocketAddress(host, port));// 设置默认访问地址

    connector.getFilterChain().addFirst("reconnection",
            new IoFilterAdapter() {
                @Override
                public void sessionClosed(NextFilter nextFilter,
                        IoSession ioSession) throws Exception {
                    for (;;) {
                        try {
                            Thread.sleep(3000);
                            ConnectFuture future = connector.connect();
                            future.awaitUninterruptibly();// 等待连接创建成功
                            session = future.getSession();// 获取会话
                            JSONObject json = signJson(parkId);
                            session.write(json);
                            logger.error("断线重连["
                                    + connector.getDefaultRemoteAddress()
                                            .getHostName()
                                    + ":"
                                    + connector.getDefaultRemoteAddress()
                                            .getPort() + "]成功");
                            break;
                        } catch (Exception ex) {
                            logger.error("重连服务器登录失败,3秒再连接一次:"
                                    + ex.getMessage());
                        }
                    }
                }
            });
    for (;;) {
        try {
            ConnectFuture future = connector.connect();
            // 等待连接创建成功
            future.awaitUninterruptibly();
            // 获取会话
            session = future.getSession();
            JSONObject json = signJson(parkId);

            session.write(json);
            logger.error("连接服务端"
                    + host
                    + ":"
                    + port
                    + "[成功]"
                    + ",,时间:"
                    + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                            .format(new Date()));
            break;
        } catch (RuntimeIoException e) {
            logger.error(
                    "连接服务端"
                            + host
                            + ":"
                            + port
                            + "失败"
                            + ",,时间:"
                            + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                                    .format(new Date())
                            + ", 连接MSG异常,请检查MSG端口、IP是否正确,MSG服务是否启动,异常内容:"
                            + e.getMessage(), e);
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e1) {
                logger.error(
                        "连接服务端"
                                + host
                                + ":"
                                + port
                                + "失败"
                                + ",,时间:"
                                + new SimpleDateFormat(
                                        "yyyy-MM-dd HH:mm:ss")
                                        .format(new Date())
                                + ", 连接MSG异常,请检查MSG端口、IP是否正确,MSG服务是否启动,异常内容:"
                                + e.getMessage(), e1);
            }
        } catch (Exception e) {
            try {
                Thread.sleep(5000);
                logger.error("连接服务器失败", e);
            } catch (InterruptedException e1) {
                e1.printStackTrace();

            }
        }
    }

}

private JSONObject signJson(int parkId) {
    JSONObject json = new JSONObject();
    json.put("tag", "0001");
    json.put("parkId", parkId);
    JSONObject data = new JSONObject();
    data.put("data", json);
    String sign = SecurityUtil
            .MD5(json.toString() + Constants.PARKING_CODE);
    data.put("sign", sign);
    data.put("flag", parkId);
    return data;
}

@Override
public void afterPropertiesSet() throws Exception {
    try {
        //web项目启动后,连接mina服务器
        new MinaClient().start();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

解决方案

没有任何异常吗?如果这样就应该检查程序逻辑

时间: 2016-05-04

apache mina-mina 线程不知什么原因死了的相关文章

用MINA可以开发telnet客户端程序吗?

问题描述 我下载了Apache的MINA框架,准备开发telnet的客户端程序.但是看了它的示例程序,发现可以telnet到服务器,但是如何都验证不了登录.如果那位大虾有用MINA开发telnet客户端程序,麻烦指点一下publicclassMainClient{publicfinalstaticInetSocketAddressserverAddress=newInetSocketAddress("localhost",23);publicfinalstaticInetSocketA

配置Apache 1.3或者Apache 2.0服务器的5个技巧

本文提出了配置Apache 1.3或者Apache 2.0服务器的5个技巧.我们将阐述以下的配置方案:调整Apache的accept()串行化.Apache 2.0线程.采用mod_ssl的SSL会话缓存.优化keep-alive超时值以及检查服务器负载以平衡服务器可处理的请求量等. AcceptMutex Apache 1.3.21和Apache 2.0中引入了AcceptMutex 指示符,该指示符给调节服务器的性能带来了一个难得的机会.该指示符配置Apache的accept()处理方式.在

配置Apache 1.3/2.0服务器的5个技巧

本文提出了配置Apache 1.3或者Apache 2.0服务器的5个技巧.我们将阐述以下的配置方案:调整Apache的accept()串行化.Apache 2.0线程.采用mod_ssl的SSL会话缓存.优化keep-alive超时值以及检查服务器负载以平衡服务器可处理的请求量等. AcceptMutex Apache 1.3.21和Apache 2.0中引入了AcceptMutex 指示符,该指示符给调节服务器的性能带来了一个难得的机会.该指示符配置Apache的accept()处理方式.在

线程的状态

一个线程可以有四种状态: (1) 新(New):线程对象已经创建,但尚未启动,所以不可运行. (2) 可运行(Runnable):意味着一旦时间分片机制有空闲的CPU周期提供给一个线程,那个线程便可立即开始运行.因此,线程可能在.也可能不在运行当中,但一旦条件许可,没有什么能阻止它的运行--它既没有"死"掉,也未被"堵塞". (3) 死(Dead):从自己的run()方法中返回后,一个线程便已"死"掉.亦可调用stop()令其死掉,但会产生一个违

J.U.C系列-线程安全的理论讲解

引文: 在J U C里面,要谈到并发,就必然就存在可见性问题,其实对于程序来讲,要说到锁,首先要确保可见性,也就是要在这个基础上才能做到,而CAS也是基于这种原理来完成,我们在文章:Java JUC之Atomic系列12大类实例讲解和原理分解 中关于Atomic的介绍中有提到通过unsafe调用底层的compareAndSwapXXX的三个方法,都是基于可见性变量才会有效.   谈到可见性,首先要明白一下内存和CPU以及多个CPU之间数据修改的基本原理,我们不要谈及CPU上太深的东西,我只需要明

Java 线程池的原理与实现

这几天主要是狂看源程序,在弥补了一些以前知识空白的同时,也学会了不少新的知识(比如 NIO),或者称为新技术吧.线程池就是其中之一,一提到线程,我们会想到以前<操作系统>的生产者与消费者,信号量,同步控制等等.一提到池,我们会想到数据库连接池,但是线程池又如何呢? 建议:在阅读本文前,先理一理同步的知识,特别是syncronized同步关键字的用法.关于我对同步的认识,要缘于大三年的一本书,书名好像是 Java 实战,这本书写得实在太妙了,真正的从理论到实践,从截图分析到.class字节码分析

C#中的线程(四)高级话题

Keywords:C# 线程Source:http://www.albahari.com/threading/Author: Joe AlbahariTranslator: Swanky WuPublished: http://www.cnblogs.com/txw1958/Download:http://www.albahari.info/threading/threading.pdf   第四部分:高级话题   非阻止同步 早些时候,我们讨论了非常简单的赋值和 更新一个字段时需要使用同步的例

c# 在线程中访问webBrowser元素抛出&amp;amp;#39;指定的转换无效&amp;amp;#39;异常

问题描述 c# 在线程中访问webBrowser元素抛出'指定的转换无效'异常 在网上搜了很多, 都说是可以用委托将函数放在主线程调用 结果也是可以了. 但是这种方法就失去了线程的防假死功能 就等于又是一个线程在运作了(或者可以说变成了一个伪线程) 不能循环的访问webBrowser元素了,不然就出现假死状态 有没有办法可以 既能够在线程中访问webBrowser元素 又可以循环访问而不假死呢? 弄了一天了,求高手解答. public Form1() { InitializeComponent(

谈谈如何使用Netty开发实现高性能的RPC服务器

  RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道调用细节的前提之下,调用远程计算机上运行的某个对象,使用起来就像调用本地的对象一样.目前典型的RPC实现框架有:Thrift(facebook开源).Dubbo(alibaba开源)等等.RPC框架针对网络协议.网络I/O模型的封装是透明的,对于调用的客户端而言,它就认为自己在调用本地的一个对象

基于xmpp openfire smack开发之Android消息推送技术原理分析和实践[4]

前面几篇给大家系统讲解的有关xmpp openfire smack asmack相关的技术和使用,大家如果有所遗忘可以参考 基于xmpp openfire smack开发之openfire介绍和部署[1] 基于xmpp openfire smack开发之smack类库介绍和使用[2] 基于xmpp openfire smack开发之Android客户端开发[3]   顺便也一起回顾下xmpp的历程 xmpp协议起源于著名的Linux即时通讯服务服务器jabber,有时候我们会把xmpp协议也叫j