Java - остановить GSON от создания дополнительного потока - PullRequest
0 голосов
/ 11 июня 2018

Я пишу небольшие фрагменты кода на Java для запуска на внутреннем сервере мобильных приложений.Сервер, который я использую, имеет ограничение в один поток, поэтому код, который я пишу, должен быть в основном синхронным и однопоточным.

Я использую gson для анализа JSON, который я получаю из стороннего API,ниже приведен пример кода:

public class JSONWorker {

    public double getJSONFromURL(String sURL){
        JsonParser jp = new JsonParser(); //from gson
        JsonElement root = null;

        // Connect to the URL using java's native library
        URL url = null;
        try {
            url = new URL(sURL);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        URLConnection request = null;
        try {
            request = url.openConnection();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            request.connect();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            root = jp.parse(new InputStreamReader((InputStream) request.getContent()));
        } catch (IOException e) {
            e.printStackTrace();
        }

        JsonObject rootobj = root.getAsJsonObject(); 
        String price = rootobj.get("lastPrice").getAsString(); 
        return Double.parseDouble(price);

    }
}

Возвращаемая ошибка говорит о том, что у меня нет разрешения на создание дополнительного потока, и указывает на эту конкретную строку как проблему:

root = jp.parse(new InputStreamReader((InputStream) request.getContent()));

Правильно ли, что анализатор JSON в gson должен создать дополнительный поток?Может ли это быть связано с тем, что он работает на удаленном сервере?Есть ли способ заставить gson или определенно синтаксический анализатор быть синхронным / однопоточным?

РЕДАКТИРОВАТЬ: Полный вывод ошибок

[ERROR] You have no permission to create thread in CodeRunner secure group.
java.lang.reflect.InvocationTargetException: null
    at sun.reflect.GeneratedMethodAccessor20.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.backendless.coderunner.runtime.task.TimerInvocationTask.runImpl(TimerInvocationTask.java:52)
    at com.backendless.coderunner.runtime.executor.ExtendedRunnable.run(ExtendedRunnable.java:39)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.security.AccessControlException: You have no permission to create thread in CodeRunner secure group.
    at com.backendless.coderunner.runtime.security.CodeRunnerSecurityManager.checkAccess(CodeRunnerSecurityManager.java:48)
    at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315)
    at java.lang.ThreadGroup.getParent(ThreadGroup.java:167)
    at sun.net.www.http.KeepAliveCache$1.run(KeepAliveCache.java:102)
    at sun.net.www.http.KeepAliveCache$1.run(KeepAliveCache.java:96)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.net.www.http.KeepAliveCache.put(KeepAliveCache.java:95)
    at sun.net.www.protocol.https.HttpsClient.putInKeepAliveCache(HttpsClient.java:659)
    at sun.net.www.http.HttpClient.finished(HttpClient.java:395)
    at sun.net.www.http.KeepAliveStream.close(KeepAliveStream.java:97)
    at sun.net.www.MeteredStream.justRead(MeteredStream.java:93)
    at sun.net.www.MeteredStream.read(MeteredStream.java:135)
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3393)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at com.google.gson.stream.JsonReader.fillBuffer(JsonReader.java:1295)
    at com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:1333)
    at com.google.gson.stream.JsonReader.consumeNonExecutePrefix(JsonReader.java:1576)
    at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:534)
    at com.google.gson.stream.JsonReader.peek(JsonReader.java:425)
    at com.google.gson.internal.Streams.parse(Streams.java:46)
    at com.google.gson.JsonParser.parse(JsonParser.java:84)
    at com.google.gson.JsonParser.parse(JsonParser.java:59)
    at com.myApp.timers.PriceGetterTimer.execute(PriceGetterTimer.java:100)
    ... 6 common frames omitted

Cheers, Mitch

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Поток создается встроенным KeepAliveCache.

Вы можете указать заголовок запроса Connection со значением Close или установить системное свойство http.keepAlive в значение false следующим образом (прежде чем вы действительно откроете соединение):

System.setProperty("http.keepAlive", "false");

Более подробную информацию можно найти здесь

0 голосов
/ 11 июня 2018

Вероятно, здесь проблема не в gson, а в request.getContent().

Во многих случаях для преобразования потока данных какого-либо вида в InputStream требуется потокэто свое.Возможно, данные поступают с веб-сайта и буферизируются уровнем веб-коммуникаций.Преобразование его в поток на лету может быть наиболее эффективно реализовано с использованием потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...