一个简单的java web程序(servlet实现接口)

帮同学写接口的时候,又重新回顾了一下servlet,发现自己基础实在是差到可以~、在此记录一下。

在servlet写线程是很不好的、但是推荐算法耗费的时间实在是多。只能开个线程让它自己跑、有什么好方法提供的请不吝赐教~

线程类:MusicRecThread.java

package com.musicRec.Code;

import com.musicRec.Utils.MusicRec;

import java.util.Map;

/**
 * Created by Administrator on 2017/6/11.
 */
public class MusicRecThread implements Runnable{

    private String userId;

    public MusicRecThread(String userId){
        this.userId = userId;
        System.out.println("start thread...");
    }

    public void run(){

        if(MusicRec.downLoadFiles(userId)){
            //执行推荐算法
            Map<String,Object> result = MusicRec.excuteMusicRec(userId);
            if(result.get("success").equals(false)){
                result.put("msg","推荐算法执行出错");
            }
        };

    }
}
servlet:

package com.musicRec.Servlet;

import com.alibaba.fastjson.JSON;
import com.musicRec.Code.MusicRecThread;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by Administrator on 2017/6/10.
 */
//@WebServlet("/getRecResult")
public class ExecuteRec extends HttpServlet {

    @Override
    public void init() throws ServletException {
    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        Map<String,Object> result = new HashMap<>();

        // 获取用户的name
        String userId = request.getParameter("userId");
        String jsonString = "";
// 设置输出
        response.setContentType("text/html;charset=GBK");
        PrintWriter printWriter = response.getWriter();
        // 对name进行转码
        if (userId != null) {
            userId = new String(userId.getBytes("ISO-8859-1"), "GBK");
            System.out.println("userId=" + userId);
            Thread t = new Thread(new MusicRecThread(userId));
            t.start();
            System.out.println("thread starting...");
            result.put("success",true);
        } else {
            result.put("success",false);
            result.put("msg","没有传入userId");
        }
        jsonString = JSON.toJSONString(result);
        printWriter.println(jsonString);
        printWriter.close();
    }

    @Override
    public void destroy() {
        super.destroy();
    }

}
推荐类:主要是连接服务器执行linux指令的一些操作。

package com.musicRec.Utils;

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.musicRec.Entity.RecordInfo;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * Created by Administrator on 2017/6/10.
 */
public class MusicRec {

    private static String url = "";
    private static String charset = "utf-8";
    private static HttpClientUtil httpClientUtil = new HttpClientUtil();;
    //ftp服务器
    private static String FTPHOSTNAME = "";
    private static String FTPNAME = "";
    private static String FTPPASSWORD = "";
    private static String REMOTEPATH = "";
    private static String LOCALPATH = "/home/ubuntu/Desktop/music_rec/user_sim/audio";
    //算法服务器
    private static String HOSTNAME = "";
    private static String NAME = "";
    private static String PASSWORD = "";
    //TODO:生成推荐信息文件
    private static String TARGETFILEPATH = "/home/ubuntu/Desktop/music_rec/user_sim/result/xyy_result_m10d2.json";

    /**
     * 根据post回来的信息下载文件到算法服务器上
     * @param userId
     * @return
     */
    public static boolean downLoadFiles(String userId){

        String httpOrgCreateTest = url + "hmzmysql/cors/getRecordInfo";
        Map<String,String> createMap = new HashMap<>();
        createMap.put("userId",userId);
        String httpOrgCreateTestRtn = httpClientUtil.doPost(httpOrgCreateTest,createMap,charset);
        System.out.println("result:" + httpOrgCreateTestRtn);

        JSONObject jsonObj = JSON.parseObject(httpOrgCreateTestRtn);

        JSONArray recordInfoArray = jsonObj.getJSONArray("recordInfo");

        List<RecordInfo> recordInfo = JSON.parseArray(recordInfoArray.toJSONString(), RecordInfo.class);

        for (RecordInfo r:recordInfo){
            System.out.println(r.getIsFlag());
            System.out.println(r.getUrl());
//            System.out.println();
//            System.out.println();
        }

//        Boolean flag = FtpClientUtils.downFile(FTPHOSTNAME,21,FTPNAME,FTPPASSWORD,REMOTEPATH,fileName,LOCALPATH);
//        return flag;
        return true;
    }


    /**
     * 执行推荐算法
     * @param userId
     * @return
     */
    public static Map<String,Object> excuteMusicRec(String userId){
        Map<String,Object> map = new HashMap<>();
        try {
        Connection conn = new Connection(HOSTNAME);
        conn.connect();//连接
        Boolean flg = conn.authenticateWithPassword(NAME, PASSWORD);//认证
        if (flg) {
            System.out.println("=====第一个步骤=====");
            Session session = conn.openSession();//打开一个会话
            //TODO:多条命令
            session.execCommand("cd /home/ubuntu/Desktop/music_rec/user_sim;echo \"123\" | sudo  -S ./caculate_tim_sim.sh similar");//执行命令
            String result = RemoteExecuteCommand.processStdout(session.getStdout(), charset);
            //如果为得到标准输出为空,说明脚本执行出错了
            if ("".equals(result)) {
                System.out.println("脚本出错");
                result = RemoteExecuteCommand.processStdout(session.getStderr(), charset);
            }
            System.out.println(result);
            session.close();

//            System.out.println("=====第二个步骤=====");
//            Session session2 = conn.openSession();//打开一个会话
//            //TODO:多条命令
//            session2.execCommand("cd /home/ubuntu/Desktop/music_rec/user_sim/result;cat xyy_result_m10d.json");//执行命令
//            String result2 = RemoteExecuteCommand.processStdout(session2.getStdout(), charset);
//            //如果为得到标准输出为空,说明脚本执行出错了
//            if ("".equals(result2)) {
//                System.out.println("脚本出错");
//                result2 = RemoteExecuteCommand.processStdout(session2.getStderr(), charset);
//            }
//            System.out.println(result2);
//            map.put("jsonData",result2);
//            session2.close();

            System.out.println("=====第三个步骤=====");
            Session session3 = conn.openSession();//打开一个会话
            //TODO:多条命令
            session3.execCommand("cd /home/ubuntu/Desktop/music_rec/effective_range_of_singing_voice;python batch.py");//执行命令
//                session2.execCommand("cd /home/ubuntu/Desktop/music_rec/user_sim/result;ls");//执行命令
            String result3 = RemoteExecuteCommand.processStdout(session3.getStdout(), charset);
            //如果为得到标准输出为空,说明脚本执行出错了
            if ("".equals(result3)) {
                System.out.println("脚本出错");
                result3 = RemoteExecuteCommand.processStdout(session3.getStderr(), charset);
            }
            System.out.println(result3);
            session3.close();

            System.out.println("=====第四个步骤(生成推荐结果)=====");
            Session session4 = conn.openSession();//打开一个会话
            //TODO:多条命令
            session4.execCommand("cd /home/ubuntu/Desktop/music_rec/recommendation;python recomendation.py");//执行命令
            String result4 = RemoteExecuteCommand.processStdout(session4.getStdout() , charset);
            //如果为得到标准输出为空,说明脚本执行出错了
            if ("".equals(result4)) {
                System.out.println("脚本出错");
                result4 = RemoteExecuteCommand.processStdout(session4.getStderr(), charset);
            }
            System.out.println(result4);
//            map.put("recResult", result4);
            session4.close();

            conn.close();
            map.put("success",true);
        }else {
            System.err.println("连接失败!");
            map.put("success",false);
        }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return map;
    }


    /**
     * 得到推荐结果
     * @param userId
     * @return
     */
    public static Map<String,Object> getMusicRecResult(String userId){
        Map<String,Object> resultMap = new HashMap<>();
        try {
            Connection conn = new Connection(HOSTNAME);
            conn.connect();//连接
            Boolean flg = conn.authenticateWithPassword(NAME, PASSWORD);//认证
            if (flg) {

                System.out.println("=====1.得到Json=====");
                Session session = conn.openSession();//打开一个会话
                //TODO:多条命令
                session.execCommand("cd /home/ubuntu/Desktop/music_rec/user_sim/result;cat xyy_result_m10d.json");//执行命令
                String result = RemoteExecuteCommand.processStdout(session.getStdout(), charset);
                //如果为得到标准输出为空,说明脚本执行出错了
                if ("".equals(result)) {
                    System.out.println("脚本出错");
                    result = RemoteExecuteCommand.processStdout(session.getStderr(), charset);
                }
                System.out.println(result);
                resultMap.put("jsonData",result.replace("\n",""));
                session.close();

                System.out.println("=====2.得到推荐结果=====");
                Session session2 = conn.openSession();//打开一个会话
                //TODO:多条命令
                session2.execCommand("cd /home/ubuntu/Desktop/music_rec/user_sim/result;cat sorted_result.txt");//执行命令
                String result2 = RemoteExecuteCommand.processStdout(session2.getStdout(), charset);
                //如果为得到标准输出为空,说明脚本执行出错了
                if ("".equals(result2)) {
                    System.out.println("脚本出错");
                    result2 = RemoteExecuteCommand.processStdout(session2.getStderr(), charset);
                }
                System.out.println(result2);
                resultMap.put("recResult", result2.replace("\t","_").replace("\n",","));
                session2.close();

                conn.close();
                resultMap.put("success",true);
            }else {
                System.err.println("连接失败!");
                resultMap.put("success",false);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }


        return resultMap;
    }




    public static void main(String[] args) {

    }


}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值