优化:日志增加一个中间状态 & 记录接口请求重试日志
This commit is contained in:
parent
cdeed5cfc3
commit
82e279e34d
|
@ -45,9 +45,17 @@ public class LogVo {
|
|||
|
||||
public int getStatusImageId() {
|
||||
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_cancel;
|
||||
}
|
||||
|
||||
public String getForwardResponse() {
|
||||
if (this.forwardStatus == 1) return "处理中...";
|
||||
|
||||
return forwardResponse;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -82,7 +82,7 @@ public class SenderBarkMsg extends SenderBaseMsg {
|
|||
|
||||
//TODO:粗略解析是否发送成功
|
||||
if (responseStr.contains("\"message\":\"success\"")) {
|
||||
LogUtil.updateLog(logId, 1, responseStr);
|
||||
LogUtil.updateLog(logId, 2, responseStr);
|
||||
} else {
|
||||
LogUtil.updateLog(logId, 0, responseStr);
|
||||
}
|
||||
|
|
|
@ -120,7 +120,7 @@ public class SenderDingdingMsg extends SenderBaseMsg {
|
|||
|
||||
//TODO:粗略解析是否发送成功
|
||||
if (responseStr.contains("\"errcode\":0")) {
|
||||
LogUtil.updateLog(logId, 1, responseStr);
|
||||
LogUtil.updateLog(logId, 2, responseStr);
|
||||
} else {
|
||||
LogUtil.updateLog(logId, 0, responseStr);
|
||||
}
|
||||
|
|
|
@ -101,7 +101,7 @@ public class SenderFeishuMsg extends SenderBaseMsg {
|
|||
|
||||
//TODO:粗略解析是否发送成功
|
||||
if (responseStr.contains("\"StatusCode\":0")) {
|
||||
LogUtil.updateLog(logId, 1, responseStr);
|
||||
LogUtil.updateLog(logId, 2, responseStr);
|
||||
} else {
|
||||
LogUtil.updateLog(logId, 0, responseStr);
|
||||
}
|
||||
|
|
|
@ -47,7 +47,7 @@ public class SenderMailMsg extends SenderBaseMsg {
|
|||
.send(draft, new EmailKit.GetSendCallback() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
LogUtil.updateLog(logId, 1, "发送成功");
|
||||
LogUtil.updateLog(logId, 2, "发送成功");
|
||||
Toast(handError, TAG, "发送成功");
|
||||
}
|
||||
|
||||
|
|
|
@ -106,7 +106,7 @@ public class SenderPushPlusMsg extends SenderBaseMsg {
|
|||
|
||||
//TODO:粗略解析是否发送成功
|
||||
if (responseStr.contains("\"code\":200")) {
|
||||
LogUtil.updateLog(logId, 1, responseStr);
|
||||
LogUtil.updateLog(logId, 2, responseStr);
|
||||
} else {
|
||||
LogUtil.updateLog(logId, 0, responseStr);
|
||||
}
|
||||
|
|
|
@ -197,7 +197,7 @@ public class SenderQyWxAppMsg extends SenderBaseMsg {
|
|||
|
||||
//TODO:粗略解析是否发送成功
|
||||
if (responseStr.contains("\"errcode\":0")) {
|
||||
LogUtil.updateLog(logId, 1, responseStr);
|
||||
LogUtil.updateLog(logId, 2, responseStr);
|
||||
} else {
|
||||
LogUtil.updateLog(logId, 0, responseStr);
|
||||
}
|
||||
|
|
|
@ -77,7 +77,7 @@ public class SenderQyWxGroupRobotMsg extends SenderBaseMsg {
|
|||
|
||||
//TODO:粗略解析是否发送成功
|
||||
if (responseStr.contains("\"errcode\":0")) {
|
||||
LogUtil.updateLog(logId, 1, responseStr);
|
||||
LogUtil.updateLog(logId, 2, responseStr);
|
||||
} else {
|
||||
LogUtil.updateLog(logId, 0, responseStr);
|
||||
}
|
||||
|
|
|
@ -68,7 +68,7 @@ public class SenderServerChanMsg extends SenderBaseMsg {
|
|||
|
||||
//TODO:粗略解析是否发送成功
|
||||
if (responseStr.contains("\"code\":0")) {
|
||||
LogUtil.updateLog(logId, 1, responseStr);
|
||||
LogUtil.updateLog(logId, 2, responseStr);
|
||||
} else {
|
||||
LogUtil.updateLog(logId, 0, responseStr);
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ public class SenderSmsMsg extends SenderBaseMsg {
|
|||
|
||||
//TODO:粗略解析是否发送成功
|
||||
if (res == null) {
|
||||
LogUtil.updateLog(logId, 1, "发送成功");
|
||||
LogUtil.updateLog(logId, 2, "发送成功");
|
||||
} else {
|
||||
LogUtil.updateLog(logId, 0, res);
|
||||
Toast(handError, TAG, "短信发送失败");
|
||||
|
|
|
@ -83,7 +83,7 @@ public class SenderTelegramMsg extends SenderBaseMsg {
|
|||
|
||||
//TODO:粗略解析是否发送成功
|
||||
if (responseStr.contains("\"ok\":true")) {
|
||||
LogUtil.updateLog(logId, 1, responseStr);
|
||||
LogUtil.updateLog(logId, 2, responseStr);
|
||||
} else {
|
||||
LogUtil.updateLog(logId, 0, responseStr);
|
||||
}
|
||||
|
|
|
@ -1,147 +1,147 @@
|
|||
package com.idormy.sms.forwarder.sender;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.util.Base64;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.idormy.sms.forwarder.utils.CertUtils;
|
||||
import com.idormy.sms.forwarder.utils.LogUtil;
|
||||
import com.idormy.sms.forwarder.utils.SettingUtil;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import javax.crypto.Mac;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
|
||||
import io.reactivex.rxjava3.core.Observable;
|
||||
import io.reactivex.rxjava3.core.ObservableEmitter;
|
||||
import okhttp3.Call;
|
||||
import okhttp3.Callback;
|
||||
import okhttp3.MediaType;
|
||||
import okhttp3.MultipartBody;
|
||||
import okhttp3.OkHttpClient;
|
||||
import okhttp3.Request;
|
||||
import okhttp3.RequestBody;
|
||||
import okhttp3.Response;
|
||||
|
||||
@SuppressWarnings({"deprecation", "ResultOfMethodCallIgnored"})
|
||||
public class SenderWebNotifyMsg extends SenderBaseMsg {
|
||||
|
||||
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 {
|
||||
Log.i(TAG, "sendMsg webServer:" + webServer + " webParams:" + webParams + " from:" + from + " content:" + content);
|
||||
|
||||
if (webServer == null || webServer.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Long timestamp = System.currentTimeMillis();
|
||||
String sign = "";
|
||||
if (secret != null && !secret.isEmpty()) {
|
||||
String stringToSign = timestamp + "\n" + secret;
|
||||
Mac mac = Mac.getInstance("HmacSHA256");
|
||||
mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
|
||||
byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8));
|
||||
sign = URLEncoder.encode(new String(Base64.encode(signData, Base64.NO_WRAP)), "UTF-8");
|
||||
Log.i(TAG, "sign:" + sign);
|
||||
}
|
||||
|
||||
Request request;
|
||||
if (method.equals("GET")) {
|
||||
webServer += (webServer.contains("?") ? "&" : "?") + "from=" + URLEncoder.encode(from, "UTF-8");
|
||||
webServer += "&content=" + URLEncoder.encode(content, "UTF-8");
|
||||
if (secret != null && !secret.isEmpty()) {
|
||||
webServer += "×tamp=" + timestamp;
|
||||
webServer += "&sign=" + sign;
|
||||
}
|
||||
|
||||
Log.d(TAG, "method = GET, Url = " + webServer);
|
||||
request = new Request.Builder().url(webServer).get().build();
|
||||
} else if (webParams != null && webParams.contains("[msg]")) {
|
||||
String bodyMsg;
|
||||
String Content_Type = "application/x-www-form-urlencoded";
|
||||
if (webParams.startsWith("{")) {
|
||||
bodyMsg = content.replace("\n", "\\n");
|
||||
bodyMsg = webParams.replace("[msg]", bodyMsg);
|
||||
Content_Type = "application/json;charset=utf-8";
|
||||
} else {
|
||||
bodyMsg = webParams.replace("[msg]", URLEncoder.encode(content, "UTF-8"));
|
||||
}
|
||||
RequestBody body = RequestBody.create(MediaType.parse(Content_Type), bodyMsg);
|
||||
request = new Request.Builder()
|
||||
.url(webServer)
|
||||
.addHeader("Content-Type", Content_Type)
|
||||
.method("POST", body)
|
||||
.build();
|
||||
Log.d(TAG, "method = POST webParams, Body = " + bodyMsg);
|
||||
} else {
|
||||
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM)
|
||||
.addFormDataPart("from", from)
|
||||
.addFormDataPart("content", content);
|
||||
if (secret != null && !secret.isEmpty()) {
|
||||
builder.addFormDataPart("timestamp", String.valueOf(timestamp));
|
||||
builder.addFormDataPart("sign", sign);
|
||||
}
|
||||
|
||||
RequestBody body = builder.build();
|
||||
Log.d(TAG, "method = POST, Body = " + body);
|
||||
request = new Request.Builder().url(webServer).method("POST", body).build();
|
||||
}
|
||||
|
||||
Observable
|
||||
.create((ObservableEmitter<Object> emitter) -> {
|
||||
Toast(handError, TAG, "开始请求接口...");
|
||||
|
||||
OkHttpClient client = new OkHttpClient().newBuilder()
|
||||
//忽略https证书
|
||||
.sslSocketFactory(CertUtils.getSSLSocketFactory(), CertUtils.getX509TrustManager())
|
||||
.hostnameVerifier(CertUtils.getHostnameVerifier())
|
||||
.build();
|
||||
Call call = client.newCall(request);
|
||||
call.enqueue(new Callback() {
|
||||
@Override
|
||||
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
|
||||
LogUtil.updateLog(logId, 0, e.getMessage());
|
||||
Toast(handError, TAG, "发送失败:" + e.getMessage());
|
||||
emitter.onError(new RuntimeException("请求接口异常..."));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
|
||||
final String responseStr = Objects.requireNonNull(response.body()).string();
|
||||
Log.d(TAG, "Response:" + response.code() + "," + responseStr);
|
||||
Toast(handError, TAG, "发送状态:" + responseStr);
|
||||
|
||||
//返回http状态200即为成功
|
||||
if (200 == response.code()) {
|
||||
LogUtil.updateLog(logId, 1, responseStr);
|
||||
} else {
|
||||
LogUtil.updateLog(logId, 0, responseStr);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
|
||||
.zipWith(Observable.just(
|
||||
SettingUtil.getRetryDelayTime(1),
|
||||
SettingUtil.getRetryDelayTime(2),
|
||||
SettingUtil.getRetryDelayTime(3),
|
||||
SettingUtil.getRetryDelayTime(4),
|
||||
SettingUtil.getRetryDelayTime(5)
|
||||
), (Throwable e, Integer time) -> time)
|
||||
.flatMap((Integer delay) -> {
|
||||
Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
|
||||
return Observable.timer(delay, TimeUnit.SECONDS);
|
||||
}))
|
||||
.subscribe(System.out::println);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
package com.idormy.sms.forwarder.sender;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.util.Base64;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.idormy.sms.forwarder.utils.CertUtils;
|
||||
import com.idormy.sms.forwarder.utils.LogUtil;
|
||||
import com.idormy.sms.forwarder.utils.SettingUtil;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import javax.crypto.Mac;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
|
||||
import io.reactivex.rxjava3.core.Observable;
|
||||
import io.reactivex.rxjava3.core.ObservableEmitter;
|
||||
import okhttp3.Call;
|
||||
import okhttp3.Callback;
|
||||
import okhttp3.MediaType;
|
||||
import okhttp3.MultipartBody;
|
||||
import okhttp3.OkHttpClient;
|
||||
import okhttp3.Request;
|
||||
import okhttp3.RequestBody;
|
||||
import okhttp3.Response;
|
||||
|
||||
@SuppressWarnings({"deprecation", "ResultOfMethodCallIgnored"})
|
||||
public class SenderWebNotifyMsg extends SenderBaseMsg {
|
||||
|
||||
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 {
|
||||
Log.i(TAG, "sendMsg webServer:" + webServer + " webParams:" + webParams + " from:" + from + " content:" + content);
|
||||
|
||||
if (webServer == null || webServer.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Long timestamp = System.currentTimeMillis();
|
||||
String sign = "";
|
||||
if (secret != null && !secret.isEmpty()) {
|
||||
String stringToSign = timestamp + "\n" + secret;
|
||||
Mac mac = Mac.getInstance("HmacSHA256");
|
||||
mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
|
||||
byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8));
|
||||
sign = URLEncoder.encode(new String(Base64.encode(signData, Base64.NO_WRAP)), "UTF-8");
|
||||
Log.i(TAG, "sign:" + sign);
|
||||
}
|
||||
|
||||
Request request;
|
||||
if (method.equals("GET")) {
|
||||
webServer += (webServer.contains("?") ? "&" : "?") + "from=" + URLEncoder.encode(from, "UTF-8");
|
||||
webServer += "&content=" + URLEncoder.encode(content, "UTF-8");
|
||||
if (secret != null && !secret.isEmpty()) {
|
||||
webServer += "×tamp=" + timestamp;
|
||||
webServer += "&sign=" + sign;
|
||||
}
|
||||
|
||||
Log.d(TAG, "method = GET, Url = " + webServer);
|
||||
request = new Request.Builder().url(webServer).get().build();
|
||||
} else if (webParams != null && webParams.contains("[msg]")) {
|
||||
String bodyMsg;
|
||||
String Content_Type = "application/x-www-form-urlencoded";
|
||||
if (webParams.startsWith("{")) {
|
||||
bodyMsg = content.replace("\n", "\\n");
|
||||
bodyMsg = webParams.replace("[msg]", bodyMsg);
|
||||
Content_Type = "application/json;charset=utf-8";
|
||||
} else {
|
||||
bodyMsg = webParams.replace("[msg]", URLEncoder.encode(content, "UTF-8"));
|
||||
}
|
||||
RequestBody body = RequestBody.create(MediaType.parse(Content_Type), bodyMsg);
|
||||
request = new Request.Builder()
|
||||
.url(webServer)
|
||||
.addHeader("Content-Type", Content_Type)
|
||||
.method("POST", body)
|
||||
.build();
|
||||
Log.d(TAG, "method = POST webParams, Body = " + bodyMsg);
|
||||
} else {
|
||||
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM)
|
||||
.addFormDataPart("from", from)
|
||||
.addFormDataPart("content", content);
|
||||
if (secret != null && !secret.isEmpty()) {
|
||||
builder.addFormDataPart("timestamp", String.valueOf(timestamp));
|
||||
builder.addFormDataPart("sign", sign);
|
||||
}
|
||||
|
||||
RequestBody body = builder.build();
|
||||
Log.d(TAG, "method = POST, Body = " + body);
|
||||
request = new Request.Builder().url(webServer).method("POST", body).build();
|
||||
}
|
||||
|
||||
Observable
|
||||
.create((ObservableEmitter<Object> emitter) -> {
|
||||
Toast(handError, TAG, "开始请求接口...");
|
||||
|
||||
OkHttpClient client = new OkHttpClient().newBuilder()
|
||||
//忽略https证书
|
||||
.sslSocketFactory(CertUtils.getSSLSocketFactory(), CertUtils.getX509TrustManager())
|
||||
.hostnameVerifier(CertUtils.getHostnameVerifier())
|
||||
.build();
|
||||
Call call = client.newCall(request);
|
||||
call.enqueue(new Callback() {
|
||||
@Override
|
||||
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
|
||||
LogUtil.updateLog(logId, 0, e.getMessage());
|
||||
Toast(handError, TAG, "发送失败:" + e.getMessage());
|
||||
emitter.onError(new RuntimeException("请求接口异常..."));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
|
||||
final String responseStr = Objects.requireNonNull(response.body()).string();
|
||||
Log.d(TAG, "Response:" + response.code() + "," + responseStr);
|
||||
Toast(handError, TAG, "发送状态:" + responseStr);
|
||||
|
||||
//返回http状态200即为成功
|
||||
if (200 == response.code()) {
|
||||
LogUtil.updateLog(logId, 2, responseStr);
|
||||
} else {
|
||||
LogUtil.updateLog(logId, 0, responseStr);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
|
||||
.zipWith(Observable.just(
|
||||
SettingUtil.getRetryDelayTime(1),
|
||||
SettingUtil.getRetryDelayTime(2),
|
||||
SettingUtil.getRetryDelayTime(3),
|
||||
SettingUtil.getRetryDelayTime(4),
|
||||
SettingUtil.getRetryDelayTime(5)
|
||||
), (Throwable e, Integer time) -> time)
|
||||
.flatMap((Integer delay) -> {
|
||||
Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
|
||||
return Observable.timer(delay, TimeUnit.SECONDS);
|
||||
}))
|
||||
.subscribe(System.out::println);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@ import java.util.List;
|
|||
public class DbHelper extends SQLiteOpenHelper {
|
||||
// If you change the database schema, you must increment the database version.
|
||||
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";
|
||||
|
||||
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 '' ";
|
||||
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) {
|
||||
|
|
|
@ -86,20 +86,17 @@ public class LogUtil {
|
|||
|
||||
}
|
||||
|
||||
public static int updateLog(Long id, int forward_status, String forward_response) {
|
||||
if (id == null || id <= 0) return 0;
|
||||
|
||||
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);
|
||||
public static void updateLog(Long id, int forward_status, String forward_response) {
|
||||
if (id == null || id <= 0) return;
|
||||
|
||||
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) {
|
||||
|
|
|
@ -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>
|
Loading…
Reference in New Issue