package crawl; import api.lb.msec.org.AccessLB; import api.lb.msec.org.Route; import api.log.msec.org.AccessLog; import api.monitor.msec.org.AccessMonitor; import com.google.protobuf.RpcController; import com.google.protobuf.ServiceException; import org.apache.log4j.Logger; import org.json.JSONArray; import org.json.JSONObject; import org.msec.rpc.ServiceFactory; import java.net.InetSocketAddress; import java.net.Socket; import java.nio.charset.Charset; import java.sql.SQLException; import java.util.*; public class ServiceImpl implements Msec.CrawlService.BlockingInterface { private static Logger log = Logger.getLogger(ServiceImpl.class.getName()); public static void main(String[] args) throws Exception { ServiceFactory.initModule("VOA_java.Crawl"); ServiceFactory.addService("crawl.CrawlService", Msec.CrawlService.BlockingInterface.class, new ServiceImpl()); ServiceFactory.runService(); } public Msec.GetMP3ListResponse getMP3List(RpcController controller, Msec.GetMP3ListRequest request) throws ServiceException { //Add your code here AccessMonitor.add("getMP3List_entry"); String type = request.getType(); AccessLog.doLog(AccessLog.LOG_LEVEL_DEBUG, "Req:" + request); Msec.GetMP3ListResponse.Builder builder = Msec.GetMP3ListResponse.newBuilder(); if ( !(type.equals("special")||type.equals("standard")) ) { builder.setStatus(100); builder.setMsg("invaid type field in request"); return builder.build(); } String jsonStr = String.format("{\"handleClass\":\"com.bison.GetMP3List\", \"requestBody\": {\"type\":\"%s\"} }", type); String lenStr = String.format("%-10d", jsonStr.getBytes().length); AccessLB lb = new AccessLB(); Route r = new Route(); Socket socket = new Socket(); DBUtil util = null; try { lb.getroutebyname("Database.mysql", r); util = new DBUtil(r.getIp()+":"+r.getPort()); if (util.getConnection() == null) { builder.setStatus(100); builder.setMsg("db connect failed!"); AccessMonitor.add("connect_mysql_fail"); return builder.build(); } AccessMonitor.add("connect_mysql_succ"); //get route information lb.getroutebyname("Jsoup.jsoup", r); if (r.getComm_type() != Route.COMM_TYPE.COMM_TYPE_TCP && r.getComm_type() != Route.COMM_TYPE.COMM_TYPE_ALL) { builder.setStatus(100); builder.setMsg("tcp is not supported by jsoup"); return builder.build(); } // connect server socket.setSoTimeout(20000);//20 seconds socket.connect(new InetSocketAddress(r.getIp(), r.getPort()), 2000); // send request bytes socket.getOutputStream().write(lenStr.getBytes(Charset.forName("utf8"))); socket.getOutputStream().write(jsonStr.getBytes(Charset.forName("utf8"))); // recv response bytes byte[] buf = new byte[102400]; int max = 10; int total = 0; while (total < max) { int len = socket.getInputStream().read(buf, total, max-total); if (len <= 0) { socket.close(); throw new Exception("recv json length failed"); } total += len; } max = new Integer(new String(buf, 0, 10, Charset.forName("utf8")).trim()).intValue(); total = 0; while (total < max) { int len = socket.getInputStream().read(buf, total, max-total); if (len <= 0) { socket.close(); throw new Exception("recv json bytes failed"); } total += len; } // parse the response json JSONObject jsonObject = new JSONObject(new String(buf, 0, total, Charset.forName("utf8"))); int status = jsonObject.getInt("status"); if (status != 0) { throw new Exception("json string status:"+status); } JSONArray mp3s = jsonObject.getJSONArray("mp3s"); for (int i = 0; i < mp3s.length() ; i++) { JSONObject mp3 = mp3s.getJSONObject(i); String title = mp3.getString("title"); String url = mp3.getString("url"); Msec.OneMP3.Builder bb = Msec.OneMP3.newBuilder(); bb.setTitle(title); bb.setUrl(url); builder.addMp3S(bb.build()); String sql = "insert into mp3_list(title, url) values(?,?)"; List<Object> params = new ArrayList<Object>(); params.add(title); params.add(url); try { int addNum = util.updateByPreparedStatement(sql, params); if (addNum < 0) { builder.setMsg("db add record failed."); builder.setStatus(100); return builder.build(); } AccessMonitor.add("access_mysql_succ"); } catch (SQLException e) { builder.setMsg("db add record failed:" + e.toString()); builder.setStatus(100); e.printStackTrace(); return builder.build(); } } AccessMonitor.add("access_jsoup_succ"); AccessLog.doLog(AccessLog.LOG_LEVEL_INFO, "Resp OK:"+ mp3s.length()); AccessLog.doLog(AccessLog.LOG_LEVEL_ERROR, "Resp OK"); } catch (Exception e) { e.printStackTrace(); builder.setStatus(100); builder.setMsg(e.getMessage()); AccessMonitor.add("getMP3List_fail"); return builder.build(); } finally { try { socket.close(); } catch (Exception e){} if(util != null && util.getConnection() != null) { util.releaseConn(); } } builder.setStatus(0); builder.setMsg("success"); return builder.build(); } }