大数据全系列 教程
1869个小节阅读:464.8k
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
一、首先分析订单支付成功事件的java sdk源码
打开cn.itbaizhan.log.test.Test类
xxxxxxxxxx
//调用该方法,触发订单支付成功事件
AnalyticsEngineSDK.onChargeSuccess("orderid123", "zhangsan");
阅读AnalyticsEngineSDK.onChargeSuccess(...)方法
xxxxxxxxxx
/**触发订单支付成功事件,发送事件数据到Nginx服务器
* @param orderId 订单支付id
* @param memberId 订单支付会员id
* @return 如果发送数据成功(加入到发送队列中),那么返回true;否则返回false(参数异常&添加到发送队列失败).
*/
public static boolean onChargeSuccess(String orderId, String memberId) {
try {
if (isEmpty(orderId) || isEmpty(memberId)) {
// 订单id或者memberid为空
log.log(Level.WARNING, "订单id和会员id不能为空");
return false;
}
// 代码执行到这儿,表示订单id和会员id都不为空。
Map<String, String> data = new HashMap<String, String>();
//初始化数据
data.put("u_mid", memberId);
data.put("oid", orderId);
data.put("c_time", String.valueOf(System.currentTimeMillis()));
data.put("ver", version);
data.put("en", "e_cs");
data.put("pl", platformName);
data.put("sdk", sdkName);
// 创建url
String url = buildUrl(data);
// 发送url&将url加入到队列
SendDataMonitor.addSendUrl(url);
return true;
} catch (Throwable e) {
log.log(Level.WARNING, "发送数据异常", e);
}
return false;
}
/**根据传入的参数构建url
* @param data 封装了所有参数的Map集合对象
* @return 将参数的map对象转换为一个字符串 http://node1/log.gif?k1=v1&k2=v2&...kn=vn
* @throws UnsupportedEncodingException
*/
private static String buildUrl(Map<String, String> data)
throws UnsupportedEncodingException {
StringBuilder sb = new StringBuilder();
sb.append(accessUrl).append("?");
for (Map.Entry<String, String> entry : data.entrySet()) {
if (isNotEmpty(entry.getKey()) && isNotEmpty(entry.getValue())) {
sb.append(entry.getKey().trim())
.append("=")
.append(URLEncoder.encode(entry.getValue().trim(), "utf-8"))
.append("&");
}
}
return sb.substring(0, sb.length() - 1);// 去掉最后&
}
/**判断字符串是否为空
* @param value
* @return 如果为空,返回true。否则返回false。
*/
private static boolean isEmpty(String value) {
return value == null || value.trim().isEmpty();
}
/**判断字符串是否非空,
* @param value
* @return 如果不是空,返回true。如果是空,返回false。
*/
private static boolean isNotEmpty(String value) {
return !isEmpty(value);
}
阅读SendDataMonitor.addSendUrl(url);
xxxxxxxxxx
// 队列,用户存储发送url
private BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
/**添加一个url到队列中去
* @param url
* @throws InterruptedException
*/
public static void addSendUrl(String url) throws InterruptedException {
getSendDataMonitor().queue.put(url);
}
阅读SendDataMonitor.getSendDataMonitor()
xxxxxxxxxx
/**获取单列的monitor对象实例
* @return
*/
public static SendDataMonitor getSendDataMonitor() {
if (monitor == null) {
synchronized (SendDataMonitor.class) {
if (monitor == null) {
monitor = new SendDataMonitor();
Thread thread = new Thread(new Runnable() {
public void run() {
// 线程中调用具体的处理方法
SendDataMonitor.monitor.run();
}
});
// 测试的时候,不设置为守护模式
// thread.setDaemon(true);
thread.start();
}
}
}
return monitor;
}
阅读SendDataMonitor.monitor.run()方法
xxxxxxxxxx
/**具体执行发送url的方法
*/
private void run() {
while (true) {
try {
//从阻塞队列queue对象中获取发送的url地址,获取到url则执行后续的代码直接发送Nginx服务器,
//如果获取不到url则产生阻塞
String url = this.queue.take();
//System.out.println(url);
// 正式的发送url
HttpRequestUtil.sendData(url);
} catch (Throwable e) {
log.log(Level.WARNING, "发送url异常", e);
}
}
}
阅读HttpRequestUtil.sendData(url)方法
xxxxxxxxxx
/**内部类,用户发送数据的http工具类
* @author Gtjin
*/
public static class HttpRequestUtil {
/**具体发送url的方法
* @param url 被发送的url地址
* @throws IOException
*/
public static void sendData(String url) throws IOException {
HttpURLConnection con = null;
BufferedReader in = null;
try {
URL obj = new URL(url); // 创建url对象
con = (HttpURLConnection) obj.openConnection(); // 打开url连接
// 设置连接参数
con.setConnectTimeout(5000); // 连接过期时间
con.setReadTimeout(5000); // 读取数据过期时间
con.setRequestMethod("GET"); // 设置请求类型为get
System.out.println("发送url:" + url);
// 发送连接请求
in = new BufferedReader(new InputStreamReader(
con.getInputStream()));
// TODO: 这里考虑是否可以
} finally {
try {
if (in != null) {
in.close();
}
} catch (Throwable e) {
// nothing
}
try {
con.disconnect();
} catch (Throwable e) {
// nothing
}
}
}
}
启动node1上Nginx服务器
xxxxxxxxxx
[root@node1 ~]# cd /usr/local/nginx/sbin/
[root@node1 sbin]# ./nginx
测试Nginx服务器是否可以正常访问http://node1/
出现Nginx欢迎页说明Nginx服务器正常启动了。
监控Nginx的日志文件
xxxxxxxxxx
[root@node1 sbin]# cd ../logs/
[root@node1 logs]# tail -f access.log
运行Test类
xxxxxxxxxx
public class Test {
public static void main(String[] args) {
AnalyticsEngineSDK.onChargeSuccess("orderid123", "zhangsan");
//AnalyticsEngineSDK.onChargeRefund("orderid456", "lisi");
}
}
注释掉onChargeRefund()方法,再运行当前类。
运行后,检查Nginx日志的监控窗口,是否产生了一条新的日志。
测试发现产生了一天订单支付成功的日志,说明该程序没有问题。