необъяснимое исключение в производительной среде для ThreadManager.createThreadForCurrentRequest - PullRequest
0 голосов
/ 21 октября 2019

Я использую этот код для отправки электронного письма. Все сводится к тому, что Google AppEngine считает, что мой текущий запрос не является потоком запросов. Как вы можете видеть из трассировки стека, это явно поток запросов, поскольку он проходит через мой метод SerPlet doPost. Код отлично работает на моем сервере разработчиков AppEngine.

Я получаю аналогичное исключение при прямом вызове Mail API, поэтому я попытался изолировать его с помощью createThreadForCurrentRequest (после многих попыток именно поэтому код использует Runnable и thread). При вызове Почтового API я получаю com.google.apphosting.api.ApiProxy $ CallNotFoundException: Невозможно создать вызов API для почты. Отправить в потоке, который не является ни исходным потоком запроса, ни потоком, созданным ThreadManager.

Это указывает на ту же основную причину, что Appengine (в производительном режиме) не верит, что мой фактический поток запросов является потоком запросов.

Я прочитал в Интернете расплывчатые намеки на то, что уход appengine-api-1.0-sdk из pom.xm l решает проблему, однако я зависит от appengine-api-1.0-sdk, и я также не могу подтвердить это утверждение.

    public void processUser(UserEnvironment userEnv) throws IOException {

        BoolCont finished = new BoolCont();
        Runnable runnable = new Runnable() {
            public void run() {

                try {
                    appPush.processUser(userEnv);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                try {
                    appEmail.processUser(userEnv);
                } catch (Exception e) {
                    e.printStackTrace();
                }

                try {
                    NotificationList notificationList = userEnv.getNotificationList();
                    log.info("This is the new notification list for user " + userEnv.getUserId() + " : "
                            + notificationList.getNotified());
                    if (notificationList.isDirty()) {
                        log.info("Writing notification list back to GCS for user " + userEnv.getUserId());
                        AppCommon.writeNotificationListToGcs(userEnv.getUserId(), notificationList);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                synchronized (finished) {
                    finished.value = true;
                    finished.notifyAll();
                }
            }
        };

        Thread thread = null;
        try {
            log.info("Creating thread");
            thread = ThreadManager.createThreadForCurrentRequest(runnable);
            log.info("Thread created: " + thread);

            thread.start();
            log.info("Thread started: " + thread);
        } catch (Throwable e) {
            finished.value = true;
            e.printStackTrace();
        }

        synchronized (finished) {
            while (!finished.value) {
                try {
                    finished.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        log.info("Thread finished: " + thread);
    }

Вот мой pom.xml

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <packaging>war</packaging>

    <version>0.1.0-SNAPSHOT</version>

    <groupId>me.georgtreu.ideallife</groupId>

    <artifactId>server</artifactId>

    <properties>

        <appengine.maven.plugin.version>2.1.0</appengine.maven.plugin.version>

        <appengine.api.sdk.version>1.9.76</appengine.api.sdk.version>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

        <maven.compiler.source>1.8</maven.compiler.source>

        <maven.compiler.target>1.8</maven.compiler.target>

        <maven.compiler.showDeprecation>true</maven.compiler.showDeprecation>

    </properties>



    <dependencies>

        <!-- Compile/runtime dependencies -->

        <dependency>

            <groupId>javax.servlet</groupId>

            <artifactId>javax.servlet-api</artifactId>

            <version>3.1.0</version>

            <scope>provided</scope>

        </dependency>

        <dependency>

            <groupId>javax.servlet.jsp</groupId>

            <artifactId>javax.servlet.jsp-api</artifactId>

            <version>2.3.1</version>

            <scope>provided</scope>

        </dependency>

        <dependency>

            <groupId>jstl</groupId>

            <artifactId>jstl</artifactId>

            <version>1.2</version>

        </dependency>


        <dependency>
            <groupId>org.imgscalr</groupId>
            <artifactId>imgscalr-lib</artifactId>
            <version>4.2</version>
        </dependency>


        <dependency>
            <groupId>com.google.firebase</groupId>
            <artifactId>firebase-admin</artifactId>
            <version>6.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.cloud</groupId>
            <artifactId>google-cloud-storage</artifactId>
            <version>1.39.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.appengine/appengine-api-1.0-sdk -->
        <dependency >
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-api-1.0-sdk</artifactId>
            <version>1.9.76</version>           
        </dependency>




        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.3.2</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>
        <dependency>
            <groupId>com.turo</groupId>
            <artifactId>pushy</artifactId>
            <version>0.13.3</version>
        </dependency>

        <!-- Test Dependencies -->

        <dependency>

            <groupId>junit</groupId>

            <artifactId>junit</artifactId>

            <version>4.12</version>

            <scope>test</scope>

        </dependency>


    </dependencies>

    <build>

        <!-- for hot reload of the web application -->

        <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory>

        <plugins>

            <plugin>

                <groupId>org.codehaus.mojo</groupId>

                <artifactId>versions-maven-plugin</artifactId>

                <version>2.3</version>

                <executions>

                    <execution>

                        <phase>compile</phase>

                        <goals>

                            <goal>display-dependency-updates</goal>

                            <goal>display-plugin-updates</goal>

                        </goals>

                    </execution>

                </executions>

            </plugin>

            <plugin>

                <groupId>com.google.cloud.tools</groupId>

                <artifactId>appengine-maven-plugin</artifactId>

                <version>${appengine.maven.plugin.version}</version>

            </plugin>

        </plugins>

    </build>

    </project>

Это исключение, которое я получаю

    java.lang.NullPointerException: Current thread is not associated with any request and is not a background thread
            at 

        com.google.appengine.api.ThreadManager.getCurrentEnvironmentOrThrow 
        (ThreadManager.java:106)
        at   

  com.google.appengine.api.ThreadManager.currentRequestThreadFactory (ThreadManager.java:47)
    at com.google.appengine.api.ThreadManager.createThreadForCurrentRequest (ThreadManager.java:66)
    at me.georgtreu.ideallife.notifications.AppNotify.processUser (AppNotify.java:64)
    at me.georgtreu.ideallife.AppCommon.processUsers (AppCommon.java:1026)
    at me.georgtreu.ideallife.servlets.NotificationServlet.doPost (NotificationServlet.java:45)
    at me.georgtreu.ideallife.servlets.NotificationServlet.doGet (NotificationServlet.java:28)
    at javax.servlet.http.HttpServlet.service (HttpServlet.java:687)
    at javax.servlet.http.HttpServlet.service (HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle (ServletHolder.java:868)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle (ServletHandler.java:542)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle (ScopedHandler.java:146)
    at org.eclipse.jetty.security.SecurityHandler.handle (SecurityHandler.java:548)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle (HandlerWrapper.java:132)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle (ScopedHandler.java:257)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle (SessionHandler.java:1711)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle (ScopedHandler.java:255)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle (ContextHandler.java:1347)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope (ScopedHandler.java:203)
    at org.eclipse.jetty.servlet.ServletHandler.doScope (ServletHandler.java:480)
    at org.eclipse.jetty.server.session.SessionHandler.doScope (SessionHandler.java:1678)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope (ScopedHandler.java:201)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope (ContextHandler.java:1249)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle (ScopedHandler.java:144)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle (ContextHandlerCollection.java:220)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle (HandlerCollection.java:152)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle (HandlerWrapper.java:132)
    at org.eclipse.jetty.server.Server.handle (Server.java:505)
    at org.eclipse.jetty.server.HttpChannel.handle (HttpChannel.java:370)
    at org.eclipse.jetty.server.HttpConnection.onFillable (HttpConnection.java:267)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded (AbstractConnection.java:305)
    at org.eclipse.jetty.io.FillInterest.fillable (FillInterest.java:103)
    at org.eclipse.jetty.io.ChannelEndPoint$2.run (ChannelEndPoint.java:117)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob (QueuedThreadPool.java:781)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run (QueuedThreadPool.java:917)
    at java.lang.Thread.run (Thread.java:748)

Для меня исключение не логично, так как ясно, что это поток запроса к сервлету

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