package com.taobao.zeus.broadcast.alarm;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import com.google.gson.Gson;
import com.taobao.zeus.store.UserManager;
import com.taobao.zeus.store.mysql.MysqlLogManager;
import com.taobao.zeus.store.mysql.persistence.ZeusUser;
import com.taobao.zeus.util.Environment;
import com.taobao.zeus.util.JsonUtil;
public class SMSAlarm extends AbstractZeusAlarm{
private static Logger log=LogManager.getLogger(SMSAlarm.class);
@Autowired
private UserManager userManager;
@Autowired
private MysqlLogManager zeusLogManager;
private static String notifyUrl = Environment.getNotifyUrl();//Noc服务器
private static String accessToken = Environment.getAccessToken();//Noc access_token
@Override
public void alarm(String jobId, List<String> uids, String title, String content)
throws Exception {
String srcId = "BI-Zeus调度系统";
String devId = InetAddress.getLocalHost().getHostName();
String itemId = "宙斯报警";
String level = "high";
String message = title;
List<ZeusUser> userList = userManager.findListByUidByOrder(uids);
if(userList != null && userList.size()>0){
for(ZeusUser user : userList){
message += "<br>负责人:"+user.getName()+" 电话:"+user.getPhone()+" 邮箱:"+user.getEmail();
}
}
message += "<br>" + content;
sendNOCAlarm(jobId, notifyUrl, accessToken, srcId, devId, itemId, level, message);
/*try{
LogDescriptor logDescriptor = new LogDescriptor();
logDescriptor.setLogType("noc");
logDescriptor.setIp(InetAddress.getLocalHost().getHostAddress());
logDescriptor.setUserName("zeus");
logDescriptor.setUrl(jobId);
logDescriptor.setRpc(srcId);
logDescriptor.setDelegate(devId);
logDescriptor.setMethod(level);
// logDescriptor.setDescription((message.length()>4000 ? message.substring(4000) : message));
logDescriptor.setDescription("");
zeusLogManager.addLog(logDescriptor);
}catch(Exception ex){
log.error(ex.toString());
}*/
}
@SuppressWarnings("deprecation")
public void sendNOCAlarm(String jobId, String sendUrl, String accessToken, String srcId, String devId, String itemId, String level, String message) {
log.info("jobId: " + jobId + " begin to send the noc, the srcId is " + srcId + ", the devId is " + devId + ", the itemId is " + itemId + ". the message is " + message + ". the sendUrl is " + sendUrl);
HttpClient client = new HttpClient();
PostMethod method = new PostMethod(sendUrl);
Gson gson = new Gson();
method.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
try {
Map<String, String> bodyMap = new HashMap<String, String>();
bodyMap.put("access_token", accessToken);
String requestBody = getRequestBody(srcId, devId, itemId, level, message);
bodyMap.put("request_body", "njson=" + requestBody);
method.setRequestBody(JsonUtil.map2json(bodyMap).toString());
int code = client.executeMethod(method);
log.info("jobId: " + jobId + " the return code is " + HttpStatus.SC_OK);
String responseBodyAsString = method.getResponseBodyAsString(2000);
log.info("jobId: " + jobId + " the response body is " + responseBodyAsString);
ResponseJson rJ = null;
if (responseBodyAsString != null) {
rJ = gson.fromJson(responseBodyAsString, ResponseJson.class);
}
if (code != HttpStatus.SC_OK || rJ == null || !rJ.isSuccess()) {
log.error("jobId: " + jobId + " send noc failed, code: " + code);
return;
}
log.info("jobId: " + jobId + " send noc successfully!");
} catch(HttpException e) {
log.error("jobId: " + jobId +" send noc fail,", e);
} catch (IOException e) {
log.error("jobId: " + jobId + " send noc fail,", e);
} catch (Exception e) {
log.error("jobId: " + jobId + " send noc fail,", e);
}
}
private String getRequestBody(String srcId, String devId, String itemId, String level, String message) throws UnsupportedEncodingException {
Map<String, String> param = new HashMap<String, String>();
param.put("src_id", srcId);
param.put("dev_id", devId);
param.put("item_id", itemId);
param.put("level", level);
param.put("message", message);
param.put("fields", "");
// System.out.println(JsonUtil.map2json(param).toString());
return URLEncoder.encode(JsonUtil.map2json(param).toString(), "utf-8");
}
class ResponseJson{
private String message;
private String data;
private boolean success;
private int error;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public int getError() {
return error;
}
public void setError(int error) {
this.error = error;
}
@Override
public String toString() {
return "ReturnJson [message=" + message + ", data=" + data
+ ", success=" + success + ", error=" + error + "]";
}
}
public static void main(String[] args) {
String returnString = "{\"message\": \"\", \"data\": \"enqueue\", \"success\": true, \"error\": 0}";
// String returnString = null;
Gson gson = new Gson();
ResponseJson rJson = gson.fromJson(returnString, ResponseJson.class);
System.out.println("the message is " + rJson.getMessage());
System.out.println("the data is " + rJson.getData());
System.out.println("the error is " + rJson.getError());
System.out.println("the success is " + rJson.isSuccess());
}
}