spring 框架中实现单线程 并当 服务器故障的时候 关闭线程


  //    private IGatewayService igs;
        /**
     *
     */
    private static final long serialVersionUID = -3858789379884703168L;

        @Autowired
        private    GateWayService  igs;
       
        private    DatagramSocket ds;
        private    DatagramPacket dp;
        private    Map<String, GateWay> allOnlineGateway;
        private    byte[] key = null;
        private    boolean flag_datagram = true;
        private    Random numRandom;
      
    @Override
        public void init() throws ServletException {
            // TODO Auto-generated method stub
            super.init();
            getServletContext().setAttribute("title", "XXXX");
//            WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
//            igs = (IGatewayService) wac.getBean("gatewayServiceImpl");
            SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
            
            allOnlineGateway = new HashMap<String, GateWay>();
            try {
             ds = new DatagramSocket(8080);
            } catch (SocketException ex) {
                Logger.getLogger(P2PServlet.class.getName()).log(Level.ERROR, null, ex);
            }
            System.out.println("启动中 .......servlet  .......");
            key = "sxycSongsk".getBytes();
            byte[] buf = new byte[512];
            dp = new DatagramPacket(buf, 512);
            numRandom = new Random();
            //数据接收线程
            new Thread() {
                //private byte [] buf = new byte[512];
                //private DatagramPacket recvdp  ;
                
                private final String replyack = "/ack/ok";
                @Override
                public void run() {
                    System.out.println("测试 ....1");
                    while (flag_datagram) {
                        try {
                            ds.receive(dp);
                        } catch (IOException ex) {
                            Logger.getLogger(P2PServlet.class.getName()).log(Level.ERROR, null, ex);
                        }
                        String d = new String(dp.getData(), 0, dp.getLength());
                        System.out.println(d);
                        try {
                            ds.send(new DatagramPacket(d.getBytes(), d.length(), dp.getSocketAddress()));
                            // try {
                            // d = Decode(new String(dp.getData(), 0,
                            // dp.getLength()));
                            // } catch (Exception ex) {
                            // Logger.getLogger(P2PServlet.class.getName()).log(Level.SEVERE,
                            // null, ex);
                            // }
                        } catch (SocketException ex) {
                            Logger.getLogger(P2PServlet.class.getName()).log(Level.ERROR, null, ex);
                        } catch (IOException ex) {
                            Logger.getLogger(P2PServlet.class.getName()).log(Level.ERROR, null, ex);
                        }

                        if (d == null) {
                            // do nothing when data is wrong;
                            continue;
                        }
                        String[] data = d.split("/");
                        if (data[0].equals("ack")) {
                            System.out.println("ack");
                            if (allOnlineGateway.containsKey(data[1])) {
                                // when receive currect data, check gateway;
                                allOnlineGateway.get(data[1]).setCount(0);
                                try {
                                    ds.send(new DatagramPacket(replyack.getBytes(), replyack.length(),
                                            dp.getSocketAddress()));
                                } catch (SocketException ex) {
                                    Logger.getLogger(P2PServlet.class.getName()).log(Level.ERROR, null, ex);
                                } catch (IOException ex) {
                                    Logger.getLogger(P2PServlet.class.getName()).log(Level.ERROR, null, ex);
                                }
                                try {
                                    igs.updateGatewayStatus(data[1], 1, dp.getAddress().getHostAddress(), data[2]);
                                } catch (Exception ex) {
                                    Logger.getLogger(P2PServlet.class.getName()).log(Level.ERROR, null, ex);
                                }
                            } else {
                                GateWay g = null;
                                try {
                                    g = igs.getgatewaybyid(data[1]);
                                } catch (Exception ex) {
                                    Logger.getLogger(P2PServlet.class.getName()).log(Level.ERROR, null, ex);
                                }
                                if (g != null) {
                                    g.setCount(0);
                                    try {
                                        igs.updateGatewayStatus(g.getGateid(), 1, dp.getAddress().getHostAddress(), data[2]);
                                    } catch (Exception ex) {
                                        Logger.getLogger(P2PServlet.class.getName()).log(Level.ALL, null, ex);
                                    }
                                    allOnlineGateway.put(g.getGateid(), g);
                                }
                            }
                        } else {

                        }
                    }
                }


            }.start();
            
            
            
            
            // 数据发送线程
            new Thread() {
                @Override
                public void run() {
                    while (flag_datagram) {
                        Iterator<Map.Entry<String, GateWay>> iter = allOnlineGateway.entrySet().iterator();
                        while (iter.hasNext()) {
                            Map.Entry<String, GateWay> e = iter.next();
                            if (e.getValue().getCount() <= 10) {
                                int count = e.getValue().getCount();
                                e.getValue().setCount(++count);
                            } else {
                                try {
                                    igs.updateGatewayStatus(e.getValue().getGateid(), 0, null, e.getValue().getGateid());
                                } catch (Exception ex) {
                                    Logger.getLogger(P2PServlet.class.getName()).log(Level.ERROR, null, ex);
                                }
                                System.out.println("remove gateway");
                                iter.remove();
                            }
                        }
                        try {
                            Thread.sleep(30000);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(P2PServlet.class.getName()).log(Level.ERROR, null, ex);
                        }
                    }
                }

            }.start();

        }

            
    
      @Override
        public void destroy() {
            super.destroy(); //To change body of generated methods, choose Tools | Templates.
            if (ds != null) {
                ds.close();
                ds = null;
            }
            flag_datagram = false;
        }
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值