如何解决W / System.err:io.reactivex.rxjava3.exceptions.UndeliverableException:无法传递异常
我在Android插件应用中使用了build job: "itext_7_dotnet/sharpen/${java.net.URLEncoder.encode branchName,'UTF-8'}"
。我试图验证是否存在递归调用,但是我找不到类似的东西。即使没有,也不确定。每次遇到此问题时,都会遇到1-2次。并且应用程序会损坏。不确定Observer或Subcriber线程或Android主线程是否出现问题,或者我是否使用了错误的可观察链接。请有人指导我解决此问题。
内部方法执行的过程如下所示: 1.调用后端REST API 2.一些数据处理,例如查询等 3.连接到sqlite并使用查询在sqlite上创建,插入或更新操作
rxjava3
这是从插件主类调用的另一个名为'SynchroizationService'方法的类。
SynchroizationService java类:
@NativePlugin
public class App extends Plugin {
private Context context;
public void load() {
// Get singleton instance of database
context = getContext();
}
@PluginMethod()
public void syncNow(PluginCall call) throws IOException,JSONException {
String result = null;
String apiUrl = call.getString("apiUrl");
JSArray parallelMethods = call.getArray("parallelMethods");
JSArray synchronousMethods = call.getArray("synchronousMethods");
String operationType = call.getString("operationType");
JSObject pluginoptions = call.getobject("pluginoptions");
synchroniztionService = new SynchroniztionService(context);
synchroniztionService.startSyncNow(call,synchronousMethods,parallelMethods,apiUrl,pluginoptions)
.observeOn(AndroidSchedulers.mainThread()).subscribe(
res -> {
System.out.println(res);
retResult(call,true,DEFAULT_RETURN);
},onError -> {
System.out.println(onError);
},() -> {
System.out.println("Completed!!");
}
);
}
private void retResult(PluginCall call,Boolean res,String message) {
JSObject ret = new JSObject();
ret.put("result",res);
if (message != null) ret.put("message",message);
call.resolve(ret);
}
}
下面的//Synization service methods
public @NonNull Observable<String> startSyncNow(PluginCall call,JSArray synchronousMethods,JSArray parallelMethods,String apiUrl,JSObject pluginoptions) throws JSONException,IOException {
return createOrAlterTable(call,pluginoptions)
.switchMap(d -> formSchemaTosqlite(call,pluginoptions))
.observeOn(Schedulers.newThread())
.switchMap(d -> menuTableRecords(call,apiUrl))
.map(d -> d);
}
// ### createOrAlterTable Start
private Observable<JSONArray> createOrAlterTable(PluginCall call,JSObject pluginoptions) throws IOException,JSONException {
// Read table from backend
// Read last sync file
// get user data
return Observable
.zip(readTableFromBackend(pluginoptions,apiUrl),readLastSyncFile(call,pluginoptions),getUserData(call,(s1,s2,s3) -> readTableFromBackendZipperFun(s1,s3,call,pluginoptions))
.subscribeOn(Schedulers.io()).observeOn(Schedulers.io())
.map(d -> d);
//
}
private @NonNull Observable<String> readTableFromBackend(
JSObject pluginoptions,String apiUrl) throws JSONException,IOException {
JSONObject obj = null;
JSONObject msgPayload = new JSONObject();
JSONObject wrapper = MessageTransformation
.getMessageWrapper(pluginoptions);
wrapper.put("Payload",msgPayload.toString());
wrapper.put("DataType","sqlLiteDDLAsync");
wrapper.put("MessageKind","READ");
// let data = JSON.parse(JSON.stringify(message));
// let options: any = getHttpHeaderOptions();
String response = this.rest.post(apiUrl,wrapper.toString());
String jsonFormattedString = new JSONTokener(response).nextValue()
.toString();
// return this.http.post(apiUrl,wrapper,options)
// .pipe(map((response: any) => { return response; }));
// obj = new JSONObject(jsonFormattedString);
return Observable.fromArray(jsonFormattedString);
}
private @NonNull Observable<JSONObject> readLastSyncFile(PluginCall call,JSObject pluginoptions) throws JSONException {
JSONObject obj = new JSONObject();
String dbname = pluginoptions.getString("database");
boolean encrypted = pluginoptions.getBoolean("encrypted");
String inmode = pluginoptions.getString("mode");
sqliteDB sqlite = new sqliteDB(this.context,encrypted,inmode,dbname);
String query = getLastSyncFileQuery(null,null);
JSArray jsArray = new JSArray();
obj = sqlite.customQuery(query,new JSArray(),call);
return Observable.fromArray(obj);
}
private String getLastSyncFileQuery(String table,String operationType) {
String query = null;
if (operationType != null) {
query = "select lastfiLeversion from LastSync where operationtype='"
+ operationType + "';";
} else {
query = "select lastfiLeversion from LastSync;";
}
return query;
}
private @NonNull Observable<Boolean> getUserData(PluginCall call,JSObject pluginoptions) throws JSONException {
boolean result = false;
// SELECT name FROM sqlite_master WHERE type='table' AND
// name='{table_name}';
String query = "SELECT name FROM sqlite_master where type='table' and name='User';";
String dbname = pluginoptions.getString("database");
boolean encrypted = pluginoptions.getBoolean("encrypted");
String inmode = pluginoptions.getString("mode");
sqliteDB sqlite = new sqliteDB(this.context,dbname);
JSONObject obj = new JSONObject();
obj = sqlite.customQuery(query,call);
JSONArray jsonArray = obj.getJSONArray("values");
if (jsonArray.length() > 0) {
result = true;
}
return Observable.fromArray(result);
}
private JSONArray readTableFromBackendZipperFun(String sqlliteDDL,JSONObject lastFV,boolean userDataFlag,PluginCall call,JsonProcessingException {
// JSONParser parser = new JSONParser();
if (lastFV != null && lastFV.has("values")) {
JSONArray array = (JSONArray) lastFV.get("values");
String lastfiLeversion = null;
if (array.length() > 0) {
JSONObject jsonObject = (JSONObject) array.get(0);
lastfiLeversion = (String) jsonObject.get("lastfiLeversion");
}
JSONObject sqlliteddlObject = new JSONObject(sqlliteDDL);// null;//(JSONObject)
// parser.parse(sqlliteDDL);
JSONObject sqlLiteDDl = this.filtersqlLiteDDLBasedOnFiLeversion(
sqlliteddlObject,lastfiLeversion,userDataFlag);
JSONArray obslist$ = new JSONArray();
String fiLeversionName = "";
JSONArray jsonArray = sqlliteddlObject.names();
for (int i = 0; i < jsonArray.length(); i++) {
String element = jsonArray.getString(i);
String isType = element.toLowerCase().contains("create") ? "Create"
: "Alter";
JSONObject jObject = (JSONObject) sqlliteddlObject.get(element);
Object resJsonPathObject = JsonPath.read(jObject.toString(),"$.structure.tables");
System.out.println(resJsonPathObject);
// String jsonPathJSONObject = new
// JSONTokener(resJsonPathObject.toString()).nextValue().toString();//
// //
// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
// compile group: 'com.fasterxml.jackson.core',name:
// 'jackson-databind',version: '2.11.2'
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper
.writeValueAsstring(resJsonPathObject);
JSONObject jsonPathJSONObject = new JSONObject(jsonString);
fiLeversionName = isType == "Alter" ? element : null;
JSONObject jsonObj = jsonPathJSONObject != null ? jsonPathJSONObject
: new JSONObject();
// observable
JSONObject obseravel$ = persistenceCreateOrAlterTable(
jsonObj.toString(),isType,pluginoptions,call);
obslist$.put(obseravel$);
}
if (fiLeversionName != "") {
// observable
JSONObject obseravel$ = fiLeversionUpdate(fiLeversionName,call);
obslist$.put(obseravel$);
}
// forkjoin return
}
JSONArray jsonArray = new JSONArray();
return jsonArray;
}
private JSONObject fiLeversionUpdate(String fileName,JSObject pluginoptions,PluginCall call) throws JSONException {
String FiLeversionUpdatequery = persistenceGetFiLeversionUpdatequery(fileName);
String dbname = pluginoptions.getString("database");
boolean encrypted = pluginoptions.getBoolean("encrypted");
String inmode = pluginoptions.getString("mode");
sqliteDB sqlite = new sqliteDB(this.context,dbname);
JSONObject res = sqlite.customExecute(FiLeversionUpdatequery,call);
return res;
}
private String persistenceGetFiLeversionUpdatequery(String fileName) {
return "Update LastSync Set lastfiLeversion = '" + fileName + "';";
}
private JSONObject filtersqlLiteDDLBasedOnFiLeversion(
JSONObject sqlliteDDL,String lastfiLeversion,boolean userDataFlag)
throws JSONException {
JSONObject tempsqlLiteDDl = new JSONObject();
if (lastfiLeversion == null && !userDataFlag) {
Iterator<String> keys = sqlliteDDL.keys();
while (keys.hasNext()) {
String key = keys.next();
if (key.contains("Create")) {
tempsqlLiteDDl.put(key,sqlliteDDL.get(key));
}
}
} else {
JSONArray jsonArray = sqlliteDDL.names();
List<String> sqlLiteDDlList = new ArrayList<String>();
for (int i = 0; i < jsonArray.length(); i++) {
sqlLiteDDlList.add(jsonArray.getString(i));
}
int fiLeversionindex = sqlLiteDDlList.indexOf(lastfiLeversion);
for (int index = 0; index < jsonArray.length(); index++) {
String element = jsonArray.getString(index);
if (element.contains("Create")) {
tempsqlLiteDDl.put(element,sqlliteDDL.get(element));// sqlLiteDDl[element];
} else if (element.contains("Alter")
&& index > fiLeversionindex) {
tempsqlLiteDDl.put(element,sqlliteDDL.get(element));// sqlLiteDDl[element];
}
}
}
return tempsqlLiteDDl;
}
private JSONObject persistenceCreateOrAlterTable(String querylist,String type,PluginCall call)
throws JSONException {
// JSONParser parser = new JSONParser();
JSONObject queries = new JSONObject(querylist);// null;//(JSONObject)parser.parse(querylist);
String statement = getqueryStatement(queries,type);
String dbname = pluginoptions.getString("database");
boolean encrypted = pluginoptions.getBoolean("encrypted");
String inmode = pluginoptions.getString("mode");
sqliteDB sqlite = new sqliteDB(this.context,dbname);
JSONObject result = sqlite.customExecute(statement,call);
return result;
}
private String getqueryStatement(JSONObject queries,String type)
throws JSONException {
String statement = "BEGIN TRANSACTION;\n";
JSONArray tablelist = queries.names();
for (int i = 0; i < tablelist.length(); i++) {
String tableName = tablelist.getString(i);
switch (type) {
case "Create":
statement = statement + " CREATE TABLE IF NOT EXISTS "
+ tableName + " " + queries.get(tableName) + ";\n";
break;
case "Alter":
statement = statement + " ALTER TABLE " + tableName + " "
+ queries.get(tableName) + ";\n";
break;
default:
break;
}
}
statement = statement + " COMMIT TRANSACTION;";
return tablelist.length() > 0 ? statement : null;
}
// ### createOrAlterTable End
// ### formSchemaTosqlite Start
private @NonNull Observable<String> formSchemaTosqlite(PluginCall call,IOException {
JSONArray values = pluginoptions.getJSONArray("values");
String dbname = pluginoptions.getString("database");
boolean encrypted = pluginoptions.getBoolean("encrypted");
String inmode = pluginoptions.getString("mode");
sqliteDB2 sqlite = new sqliteDB2(this.context,dbname);
for (int i = 0; i < values.length(); i++) {
JSONObject table = (JSONObject) values.get(i);
String lastSyncTime = table.getString("LastSyncTime");
String tableName = "FormSchema";// table.getString("tableName");
JSONObject msgPayload = new JSONObject();
if (lastSyncTime == "null") {
msgPayload.put("lastsynctime",JSONObject.NULL);
} else {
msgPayload.put("lastsynctime",lastSyncTime);
}
JSONObject wrapper = table.getJSONObject("MessageWrapper");
wrapper.put("Payload",msgPayload.toString());
wrapper.put("DataType","FormSchemaSync");
wrapper.put("MessageKind","READ");
System.out.println("before rest");
String response = this.rest.post(apiUrl,wrapper.toString());
String jsonFormattedString = new JSONTokener(response).nextValue()
.toString();
// System.out.println(response);
JSONArray jsArray = new JSONArray(jsonFormattedString);
List<String> queries = new ArrayList<String>();
for (int j = 0; j < jsArray.length(); j++) {
String query = sqliteDB2.createPreparedStmtQuery(
((JSONObject) jsArray.get(j)),tableName);
queries.add(query);
}
// sqlite.executeBatchsqliteQuery(queries,call);
sqlite.executeBatchsqlitePreparedStatement(queries,call);
}
return Observable.fromArray(DEFAULT_RETURN);
}
// ### formSchemaTosqlite End
用于为查询方法创建语句和文字值
createPreparedStmtQuery
错误:
public static String createPreparedStmtQuery(JSONObject record,String tableName) throws JSONException {
record = modifyRecord(record);
Iterator<String> keys = record.keys();
StringBuilder builder = new StringBuilder();
builder.append("insert or replace into ");
builder.append(tableName);
builder.append(" (");
while(keys.hasNext()){
builder.append(keys.next()).append(",");
}
builder.setLength(builder.length() - 1);
builder.append(") values(");
keys = record.keys();
JSArray valuesArray = new JSArray();
while(keys.hasNext()){
String key = keys.next();
if( record.get(key) != null && record.get(key) instanceof String) {
//record.get(key).replace(/\'/g,'\'\'') ;
}
builder.append("?").append(",");
valuesArray.put(record.get(key));
}
builder.deleteCharat(builder.length() - 1);
builder.append(");");
JSONObject ret = new JSONObject();
ret.put("query",builder.toString());
ret.put("values",valuesArray);
return ret.toString();
}
请提供任何帮助。
谢谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。