2 mqwsd mqwsd 于 2016.02.20 14:02 提问

mina 线程不知什么原因死了 5C

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();
    }

}

1个回答

WinsenJiansbomber
WinsenJiansbomber   2016.03.08 13:49

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
关于MINA框架的线程安全问题
最近一直研究MINA来写服务程序,发现了 一些问题,在此记一下,和大家共享,不对之处,多多指教。          MINA可以由我们添加一个线程池,如果没有的话,它会自己产生一个线程池供自己使用,mina的效率还是很不错的。我们可以发现setHandler时候,只添加一个Io
Mina的多线程模式——节选自设计文档
<! v/:* {behavior:url(#default#VML);}o/:* {behavior:url(#default#VML);}w/:* {behavior:url(#default#VML);}.shape {behavior:url(#default#VML);}-->1.1      多线程模式 由于本项目使用的 Apac
深入理解Apache Mina(5)---- 配置Mina的 线程模型
<br /><br />在Mina的使用中,线程池的配置一个比较关键的环节,同时它也是Mina性能提高的一个有效的方法,在Mina的2.0以上版本中已经不再需要对Mina线程池的配置了,本系列文章都是基于当前的稳定版本Mina 1.1.7版来进行讲述的,Mina的2.0以上版本现在还都是M(millestone,即里程碑)版的,在1.5版本上2.0M版为稳定版本,但是在1.5+以上则为非稳定版本,所以,为了更好的进行讨论和学习,还是基于Mina 1.1.7版本进行讨论,如果使用Mina 2.0进
MINA框架 中JAVA NIO处理主要逻辑的processor线程
/** * The main loop. This is the place in charge to poll负责轮询 the Selector, and to * process the active sessions. It's done in * - handle the newly created sessions * - */
Mina 线程模型分析
想要知道Mina都在上面地方使用了线程,博主自己写了一个简单的程序代码来寻找,考虑到server端和client端是同一个链接,不妨就不要client端了,server端代码如下: public class Myserver {     private static Logger logger = LoggerFactory.getLogger(Myserver.class);
Apache mina -Processor线程逻辑
Processor 是AbstractPollingIoProcessor 抽象类内部的私有类。 Processor 是一个处理I/O输出输出数据流的主要循环主体。 1、 优先处理新IoSession 的逻辑处理 2、抖动处理 3、IoSession 的输入输出工作。
调试程序图片
图片 测试程序专用 不知什么原因 大神SS小女子
Adblock Plus 1.3.2下载
不知什么原因,Adblock Plus 1.3.2不能下载了,现在给一份
网上售票管理系统
一般,不知什么原因,在我电脑无法运行。网上售票管理系统
mina2多线程读取重复数据的解决方案
公司定制了一个可以控制设备的硬件,人家只支持socket,我用mina2做的客户端连接,因为是多个人可以控制的所以硬件控制设置的连接只能有一个,多个用户用这个连接来控制设备,用完链接放在缓存里面,超时自动断掉,用的时候重新连接。 连接管理的代码 public class ManySocketPoolMangerSingleton { private static ManySocketPo