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

pull/86/head
pppscn 3 years ago
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 += "&timestamp=" + 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 += "&timestamp=" + 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…
Cancel
Save