概述
帮同学写接口的时候,又重新回顾了一下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) {
}
}
最后
以上就是单身咖啡豆为你收集整理的一个简单的java web程序(servlet实现接口)的全部内容,希望文章能够帮你解决一个简单的java web程序(servlet实现接口)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复