• Java打包


    由于发布系统需要上传修改过后的配置文件到服务器上,但是由于Jenkins的客户端上传文件的功能我暂时还没有研究出来,所以在Jenkins服务器上写一个Java脚本,监听端口,来获取上传文件的socket请求。

    脚本采用最简单的BIO模型,整个程序只有一个线程,也就是主线程,负责监听8088端口,接收到socket连接,直接在死循环中,进行文件处理。

    public class SocketServer {
    
        private ServerSocket serverSocket;
        private String fileName = "application-prod.yml";
        private Integer port;
        private String folder;
        Logger logger = Logger.getLogger("SocketServer");
    
        public void receive() {
            String path = folder;
            while (true) {
                if (port == null) {
                    break;
                }
                System.out.println("--------listen on " + port + "--------");
                try {
                    Socket socket = serverSocket.accept();
                    System.out.println(socket.getInetAddress() + ":" + socket.getPort());
    
                    InputStream in = socket.getInputStream();
                    OutputStream out = new FileOutputStream(path + fileName);
                    byte[] bytes = new byte[16 * 1024];
    
                    int count;
                    while ((count = in.read(bytes)) > 0) {
                        out.write(bytes, 0, count);
                    }
                    out.close();
                    in.close();
    
                    removeFile(path, fileName);
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
            }
        }
    
        private void removeFile(String path, String fileName) throws IOException {
            String line = getFirstLine(path);
            String serviceName = line.substring(2);
    
            Files.move(Paths.get(path + "/" + fileName),
                    Paths.get(path + "/" + serviceName + "/ " + fileName),
                    REPLACE_EXISTING);
        }
    
        public String getFirstLine(String path) throws IOException {
            BufferedReader br = new BufferedReader(new FileReader(path + "/" + fileName));
            String line = br.readLine();
            br.close();
            return line;
        }
    
       public String initServer(Integer port, String folder) {
            try {
                this.port = port;
                this.folder = folder;
                serverSocket = new ServerSocket(this.port);
                return "success";
            } catch (IOException e) {
                return e.getMessage();
            }
        }
    
        public static void main(String[] args) {
            SocketServer socketServer = new SocketServer();
    
            if (args.length == 0) {
                socketServer.logger.log(Level.ALL, "start server");
                System.out.println("This run need two parameters. format: java className [port] [config file folder]");
                return;
            }
    
            String port = args[0];
            String folder = args[1];
            if (folder.lastIndexOf("/") + 1 != folder.length()) {
                folder = folder + "/";
            }
    
    
            String message = socketServer.initServer(Integer.valueOf(port), folder);
            if (message.equals("success")) {
                socketServer.receive();
            }
            System.out.println("server cannot start logically, because " + message);
        }
    }

    由于运维要求Java服务需要打成jar包,这样进程可以管理,因为机器上有很多服务,防止其他人误杀死该进程。

    jar -cvf target_jar_name.jar compiled_class_name.class

    如果直接运行,会报错,错误信息   no main manifest attribute, in SocketServer.jar

    这是因为 MANIFEST-MF文件中少了一个参数,直接编辑jar包,在MANIFEST-MF文件末尾,加上Main-Class: SocketServer

  • 相关阅读:
    在Vue.js中使用Stylus预处理器
    前端面试问题(JavaScript)
    前端面试问题(CSS3)
    前端面试问题(HTML5+Http+web)
    VUE2中文文档:组件基础篇
    VUE2中文文档:语法基础笔记
    transition动画效果初识(实例)
    Centos5.2升级openssh7.4p1
    解决python升级导致pip无法使用
    使用jenkins时因为脚本权限问题执行项目失败
  • 原文地址:https://www.cnblogs.com/markytsai/p/13429722.html
Copyright © 2020-2023  润新知