优化:日志增加一个中间状态 & 记录接口请求重试日志

This commit is contained in:
pppscn 2021-12-07 17:13:12 +08:00
parent cdeed5cfc3
commit 82e279e34d
15 changed files with 185 additions and 171 deletions

View File

@ -45,9 +45,17 @@ public class LogVo {
public int getStatusImageId() { public int getStatusImageId() {
if (this.forwardStatus == 1) { if (this.forwardStatus == 1) {
return R.drawable.ic_round_warning;
} else if (this.forwardStatus == 2) {
return R.drawable.ic_round_check; return R.drawable.ic_round_check;
} }
return R.drawable.ic_round_cancel; return R.drawable.ic_round_cancel;
} }
public String getForwardResponse() {
if (this.forwardStatus == 1) return "处理中...";
return forwardResponse;
}
} }

View File

@ -82,7 +82,7 @@ public class SenderBarkMsg extends SenderBaseMsg {
//TODO:粗略解析是否发送成功 //TODO:粗略解析是否发送成功
if (responseStr.contains("\"message\":\"success\"")) { if (responseStr.contains("\"message\":\"success\"")) {
LogUtil.updateLog(logId, 1, responseStr); LogUtil.updateLog(logId, 2, responseStr);
} else { } else {
LogUtil.updateLog(logId, 0, responseStr); LogUtil.updateLog(logId, 0, responseStr);
} }

View File

@ -120,7 +120,7 @@ public class SenderDingdingMsg extends SenderBaseMsg {
//TODO:粗略解析是否发送成功 //TODO:粗略解析是否发送成功
if (responseStr.contains("\"errcode\":0")) { if (responseStr.contains("\"errcode\":0")) {
LogUtil.updateLog(logId, 1, responseStr); LogUtil.updateLog(logId, 2, responseStr);
} else { } else {
LogUtil.updateLog(logId, 0, responseStr); LogUtil.updateLog(logId, 0, responseStr);
} }

View File

@ -101,7 +101,7 @@ public class SenderFeishuMsg extends SenderBaseMsg {
//TODO:粗略解析是否发送成功 //TODO:粗略解析是否发送成功
if (responseStr.contains("\"StatusCode\":0")) { if (responseStr.contains("\"StatusCode\":0")) {
LogUtil.updateLog(logId, 1, responseStr); LogUtil.updateLog(logId, 2, responseStr);
} else { } else {
LogUtil.updateLog(logId, 0, responseStr); LogUtil.updateLog(logId, 0, responseStr);
} }

View File

@ -47,7 +47,7 @@ public class SenderMailMsg extends SenderBaseMsg {
.send(draft, new EmailKit.GetSendCallback() { .send(draft, new EmailKit.GetSendCallback() {
@Override @Override
public void onSuccess() { public void onSuccess() {
LogUtil.updateLog(logId, 1, "发送成功"); LogUtil.updateLog(logId, 2, "发送成功");
Toast(handError, TAG, "发送成功"); Toast(handError, TAG, "发送成功");
} }

View File

@ -106,7 +106,7 @@ public class SenderPushPlusMsg extends SenderBaseMsg {
//TODO:粗略解析是否发送成功 //TODO:粗略解析是否发送成功
if (responseStr.contains("\"code\":200")) { if (responseStr.contains("\"code\":200")) {
LogUtil.updateLog(logId, 1, responseStr); LogUtil.updateLog(logId, 2, responseStr);
} else { } else {
LogUtil.updateLog(logId, 0, responseStr); LogUtil.updateLog(logId, 0, responseStr);
} }

View File

@ -197,7 +197,7 @@ public class SenderQyWxAppMsg extends SenderBaseMsg {
//TODO:粗略解析是否发送成功 //TODO:粗略解析是否发送成功
if (responseStr.contains("\"errcode\":0")) { if (responseStr.contains("\"errcode\":0")) {
LogUtil.updateLog(logId, 1, responseStr); LogUtil.updateLog(logId, 2, responseStr);
} else { } else {
LogUtil.updateLog(logId, 0, responseStr); LogUtil.updateLog(logId, 0, responseStr);
} }

View File

@ -77,7 +77,7 @@ public class SenderQyWxGroupRobotMsg extends SenderBaseMsg {
//TODO:粗略解析是否发送成功 //TODO:粗略解析是否发送成功
if (responseStr.contains("\"errcode\":0")) { if (responseStr.contains("\"errcode\":0")) {
LogUtil.updateLog(logId, 1, responseStr); LogUtil.updateLog(logId, 2, responseStr);
} else { } else {
LogUtil.updateLog(logId, 0, responseStr); LogUtil.updateLog(logId, 0, responseStr);
} }

View File

@ -68,7 +68,7 @@ public class SenderServerChanMsg extends SenderBaseMsg {
//TODO:粗略解析是否发送成功 //TODO:粗略解析是否发送成功
if (responseStr.contains("\"code\":0")) { if (responseStr.contains("\"code\":0")) {
LogUtil.updateLog(logId, 1, responseStr); LogUtil.updateLog(logId, 2, responseStr);
} else { } else {
LogUtil.updateLog(logId, 0, responseStr); LogUtil.updateLog(logId, 0, responseStr);
} }

View File

@ -20,7 +20,7 @@ public class SenderSmsMsg extends SenderBaseMsg {
//TODO:粗略解析是否发送成功 //TODO:粗略解析是否发送成功
if (res == null) { if (res == null) {
LogUtil.updateLog(logId, 1, "发送成功"); LogUtil.updateLog(logId, 2, "发送成功");
} else { } else {
LogUtil.updateLog(logId, 0, res); LogUtil.updateLog(logId, 0, res);
Toast(handError, TAG, "短信发送失败"); Toast(handError, TAG, "短信发送失败");

View File

@ -83,7 +83,7 @@ public class SenderTelegramMsg extends SenderBaseMsg {
//TODO:粗略解析是否发送成功 //TODO:粗略解析是否发送成功
if (responseStr.contains("\"ok\":true")) { if (responseStr.contains("\"ok\":true")) {
LogUtil.updateLog(logId, 1, responseStr); LogUtil.updateLog(logId, 2, responseStr);
} else { } else {
LogUtil.updateLog(logId, 0, responseStr); LogUtil.updateLog(logId, 0, responseStr);
} }

View File

@ -1,147 +1,147 @@
package com.idormy.sms.forwarder.sender; package com.idormy.sms.forwarder.sender;
import android.os.Handler; import android.os.Handler;
import android.util.Base64; import android.util.Base64;
import android.util.Log; import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.idormy.sms.forwarder.utils.CertUtils; import com.idormy.sms.forwarder.utils.CertUtils;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil; import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException; import java.io.IOException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.crypto.Mac; import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter; import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
import okhttp3.MediaType; import okhttp3.MediaType;
import okhttp3.MultipartBody; import okhttp3.MultipartBody;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
@SuppressWarnings({"deprecation", "ResultOfMethodCallIgnored"}) @SuppressWarnings({"deprecation", "ResultOfMethodCallIgnored"})
public class SenderWebNotifyMsg extends SenderBaseMsg { public class SenderWebNotifyMsg extends SenderBaseMsg {
static final String TAG = "SenderWebNotifyMsg"; static final String TAG = "SenderWebNotifyMsg";
public static void sendMsg(final long logId, final Handler handError, String webServer, String webParams, String secret, String method, String from, String content) throws Exception { public static void sendMsg(final long logId, final Handler handError, String webServer, String webParams, String secret, String method, String from, String content) throws Exception {
Log.i(TAG, "sendMsg webServer:" + webServer + " webParams:" + webParams + " from:" + from + " content:" + content); Log.i(TAG, "sendMsg webServer:" + webServer + " webParams:" + webParams + " from:" + from + " content:" + content);
if (webServer == null || webServer.isEmpty()) { if (webServer == null || webServer.isEmpty()) {
return; return;
} }
Long timestamp = System.currentTimeMillis(); Long timestamp = System.currentTimeMillis();
String sign = ""; String sign = "";
if (secret != null && !secret.isEmpty()) { if (secret != null && !secret.isEmpty()) {
String stringToSign = timestamp + "\n" + secret; String stringToSign = timestamp + "\n" + secret;
Mac mac = Mac.getInstance("HmacSHA256"); Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256")); mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8)); byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8));
sign = URLEncoder.encode(new String(Base64.encode(signData, Base64.NO_WRAP)), "UTF-8"); sign = URLEncoder.encode(new String(Base64.encode(signData, Base64.NO_WRAP)), "UTF-8");
Log.i(TAG, "sign:" + sign); Log.i(TAG, "sign:" + sign);
} }
Request request; Request request;
if (method.equals("GET")) { if (method.equals("GET")) {
webServer += (webServer.contains("?") ? "&" : "?") + "from=" + URLEncoder.encode(from, "UTF-8"); webServer += (webServer.contains("?") ? "&" : "?") + "from=" + URLEncoder.encode(from, "UTF-8");
webServer += "&content=" + URLEncoder.encode(content, "UTF-8"); webServer += "&content=" + URLEncoder.encode(content, "UTF-8");
if (secret != null && !secret.isEmpty()) { if (secret != null && !secret.isEmpty()) {
webServer += "&timestamp=" + timestamp; webServer += "&timestamp=" + timestamp;
webServer += "&sign=" + sign; webServer += "&sign=" + sign;
} }
Log.d(TAG, "method = GET, Url = " + webServer); Log.d(TAG, "method = GET, Url = " + webServer);
request = new Request.Builder().url(webServer).get().build(); request = new Request.Builder().url(webServer).get().build();
} else if (webParams != null && webParams.contains("[msg]")) { } else if (webParams != null && webParams.contains("[msg]")) {
String bodyMsg; String bodyMsg;
String Content_Type = "application/x-www-form-urlencoded"; String Content_Type = "application/x-www-form-urlencoded";
if (webParams.startsWith("{")) { if (webParams.startsWith("{")) {
bodyMsg = content.replace("\n", "\\n"); bodyMsg = content.replace("\n", "\\n");
bodyMsg = webParams.replace("[msg]", bodyMsg); bodyMsg = webParams.replace("[msg]", bodyMsg);
Content_Type = "application/json;charset=utf-8"; Content_Type = "application/json;charset=utf-8";
} else { } else {
bodyMsg = webParams.replace("[msg]", URLEncoder.encode(content, "UTF-8")); bodyMsg = webParams.replace("[msg]", URLEncoder.encode(content, "UTF-8"));
} }
RequestBody body = RequestBody.create(MediaType.parse(Content_Type), bodyMsg); RequestBody body = RequestBody.create(MediaType.parse(Content_Type), bodyMsg);
request = new Request.Builder() request = new Request.Builder()
.url(webServer) .url(webServer)
.addHeader("Content-Type", Content_Type) .addHeader("Content-Type", Content_Type)
.method("POST", body) .method("POST", body)
.build(); .build();
Log.d(TAG, "method = POST webParams, Body = " + bodyMsg); Log.d(TAG, "method = POST webParams, Body = " + bodyMsg);
} else { } else {
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM) MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("from", from) .addFormDataPart("from", from)
.addFormDataPart("content", content); .addFormDataPart("content", content);
if (secret != null && !secret.isEmpty()) { if (secret != null && !secret.isEmpty()) {
builder.addFormDataPart("timestamp", String.valueOf(timestamp)); builder.addFormDataPart("timestamp", String.valueOf(timestamp));
builder.addFormDataPart("sign", sign); builder.addFormDataPart("sign", sign);
} }
RequestBody body = builder.build(); RequestBody body = builder.build();
Log.d(TAG, "method = POST, Body = " + body); Log.d(TAG, "method = POST, Body = " + body);
request = new Request.Builder().url(webServer).method("POST", body).build(); request = new Request.Builder().url(webServer).method("POST", body).build();
} }
Observable Observable
.create((ObservableEmitter<Object> emitter) -> { .create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口..."); Toast(handError, TAG, "开始请求接口...");
OkHttpClient client = new OkHttpClient().newBuilder() OkHttpClient client = new OkHttpClient().newBuilder()
//忽略https证书 //忽略https证书
.sslSocketFactory(CertUtils.getSSLSocketFactory(), CertUtils.getX509TrustManager()) .sslSocketFactory(CertUtils.getSSLSocketFactory(), CertUtils.getX509TrustManager())
.hostnameVerifier(CertUtils.getHostnameVerifier()) .hostnameVerifier(CertUtils.getHostnameVerifier())
.build(); .build();
Call call = client.newCall(request); Call call = client.newCall(request);
call.enqueue(new Callback() { call.enqueue(new Callback() {
@Override @Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) { public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage()); Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常...")); emitter.onError(new RuntimeException("请求接口异常..."));
} }
@Override @Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string(); final String responseStr = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Response" + response.code() + "" + responseStr); Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr); Toast(handError, TAG, "发送状态:" + responseStr);
//返回http状态200即为成功 //返回http状态200即为成功
if (200 == response.code()) { if (200 == response.code()) {
LogUtil.updateLog(logId, 1, responseStr); LogUtil.updateLog(logId, 2, responseStr);
} else { } else {
LogUtil.updateLog(logId, 0, responseStr); LogUtil.updateLog(logId, 0, responseStr);
} }
} }
}); });
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable }).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
.zipWith(Observable.just( .zipWith(Observable.just(
SettingUtil.getRetryDelayTime(1), SettingUtil.getRetryDelayTime(1),
SettingUtil.getRetryDelayTime(2), SettingUtil.getRetryDelayTime(2),
SettingUtil.getRetryDelayTime(3), SettingUtil.getRetryDelayTime(3),
SettingUtil.getRetryDelayTime(4), SettingUtil.getRetryDelayTime(4),
SettingUtil.getRetryDelayTime(5) SettingUtil.getRetryDelayTime(5)
), (Throwable e, Integer time) -> time) ), (Throwable e, Integer time) -> time)
.flatMap((Integer delay) -> { .flatMap((Integer delay) -> {
Toast(handError, TAG, "请求接口异常," + delay + "秒后重试"); Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
return Observable.timer(delay, TimeUnit.SECONDS); return Observable.timer(delay, TimeUnit.SECONDS);
})) }))
.subscribe(System.out::println); .subscribe(System.out::println);
} }
} }

View File

@ -16,7 +16,7 @@ import java.util.List;
public class DbHelper extends SQLiteOpenHelper { public class DbHelper extends SQLiteOpenHelper {
// If you change the database schema, you must increment the database version. // If you change the database schema, you must increment the database version.
public static final String TAG = "DbHelper"; public static final String TAG = "DbHelper";
public static final int DATABASE_VERSION = 7; public static final int DATABASE_VERSION = 8;
public static final String DATABASE_NAME = "sms_forwarder.db"; public static final String DATABASE_NAME = "sms_forwarder.db";
private static final List<String> SQL_CREATE_ENTRIES = private static final List<String> SQL_CREATE_ENTRIES =
@ -109,6 +109,10 @@ public class DbHelper extends SQLiteOpenHelper {
String sql = "Alter table " + RuleTable.RuleEntry.TABLE_NAME + " add column " + RuleTable.RuleEntry.COLUMN_REGEX_REPLACE + " TEXT NOT NULL DEFAULT '' "; String sql = "Alter table " + RuleTable.RuleEntry.TABLE_NAME + " add column " + RuleTable.RuleEntry.COLUMN_REGEX_REPLACE + " TEXT NOT NULL DEFAULT '' ";
db.execSQL(sql); db.execSQL(sql);
} }
if (oldVersion < 8) { //更新日志表状态0=失败1=待处理2=成功
String sql = "update " + LogTable.LogEntry.TABLE_NAME + " set " + LogTable.LogEntry.COLUMN_NAME_FORWARD_STATUS + " = 2 where " + LogTable.LogEntry.COLUMN_NAME_FORWARD_STATUS + " = 1 ";
db.execSQL(sql);
}
} }
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {

View File

@ -86,20 +86,17 @@ public class LogUtil {
} }
public static int updateLog(Long id, int forward_status, String forward_response) { public static void updateLog(Long id, int forward_status, String forward_response) {
if (id == null || id <= 0) return 0; if (id == null || id <= 0) return;
String selection = LogTable.LogEntry._ID + " = ? ";
List<String> selectionArgList = new ArrayList<>();
selectionArgList.add(String.valueOf(id));
ContentValues values = new ContentValues();
values.put(LogTable.LogEntry.COLUMN_NAME_FORWARD_STATUS, forward_status);
values.put(LogTable.LogEntry.COLUMN_NAME_FORWARD_RESPONSE, forward_response);
String[] selectionArgs = selectionArgList.toArray(new String[0]);
return db.update(LogTable.LogEntry.TABLE_NAME, values, selection, selectionArgs);
String sql = new StringBuilder().append("UPDATE ").append(LogTable.LogEntry.TABLE_NAME)
.append(" SET ").append(LogTable.LogEntry.COLUMN_NAME_FORWARD_STATUS).append(" = ? , ")
.append(LogTable.LogEntry.COLUMN_NAME_FORWARD_RESPONSE)
.append(" = CASE WHEN ").append(LogTable.LogEntry.COLUMN_NAME_FORWARD_STATUS).append(" = 1 THEN ? ELSE ")
.append(LogTable.LogEntry.COLUMN_NAME_FORWARD_RESPONSE).append(" || '\n ---------- \n' || ? END ")
.append(" WHERE ").append(LogTable.LogEntry._ID).append(" = ? ")
.toString();
db.execSQL(sql, new Object[]{forward_status, forward_response, forward_response, id});
} }
public static List<LogVo> getLog(Long id, String key, String type) { public static List<LogVo> getLog(Long id, String key, String type) {

View File

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFCC00"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-2h2v2zM13,13h-2L11,7h2v6z"/>
</vector>