ModulesException:未知模块

时间:2016-07-18 14:43:23

标签: java google-app-engine gradle google-cloud-endpoints

我有一个用Java,App Engine,Gradle和Cloud Endpoints编写的后端。我使用App Engine Gradle Plugin中的functionalTests测试端点。这一切都很好。

我遇到的问题是其中一个端点将任务发布到不存在的模块。至少在本地开发服务器上是真的。在生产中,模块确实存在。如何告诉本地开发服务器该模块是否存在?

public void execute(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap args) throws WorkflowException {
    Session participantSession = null;
    Session replicationSession = null;
    // ResourceResolver resourceResolver = null;
    try {
        log.info("Inside ActivatemyAppPageProcess ");
        Session session = workflowSession.getSession();
        if (replicateAsParticipant(args)) {
            String approverId = resolveParticipantId(workItem, workflowSession);
            if (approverId != null) {
                participantSession = getParticipantSession(approverId, workflowSession);
            }
        }
        if (participantSession != null)
            replicationSession = participantSession;
        else {
            replicationSession = session;
        }

        WorkflowData data = workItem.getWorkflowData();
        String path = null;
        String type = data.getPayloadType();
        if ((type.equals("JCR_PATH")) && (data.getPayload() != null)) {
            String payloadData = (String) data.getPayload();
            if (session.itemExists(payloadData))
                path = payloadData;
            }
            else if ((data.getPayload() != null) && (type.equals("JCR_UUID"))) {
                Node node = session.getNodeByUUID((String) data.getPayload());
                path = node.getPath();
            }
            ReplicationOptions opts = null;
            String rev = (String) data.getMetaDataMap().get("resourceVersion", String.class);
            if (rev != null) {
                opts = new ReplicationOptions();
                opts.setRevision(rev);
            }
            opts = prepareOptions(opts);

            if (path != null) {
                ResourceCollection rcCollection = 
                    ResourceCollectionUtil
                        .getResourceCollection(
                            (Node) this.admin.getItem(path), 
                                (ResourceCollectionManager) this.rcManager);
                boolean isWFPackage = isWorkflowPackage(path, resolverFactory, workflowSession);
                List<String> paths = getPaths(path, rcCollection);
                for (String aPath : paths)
                    if (canReplicate(replicationSession, aPath)) {
                        if (opts != null) {
                            if (isWFPackage) {
                                setRevisionForPage(aPath, opts, data);
                            }
                            this.replicator
                                    .replicate(replicationSession, 
                                                   getReplicationType(),
                                                       aPath,
                                                           opts);
                            } else {
                                this.replicator
                                        .replicate(replicationSession, 
                                                       getReplicationType(),
                                                           aPath);
                        }
                    } else {
                        log.debug(session.getUserID() + " is not allowed to replicate " + "this page/asset " + aPath + ". Issuing request for 'replication");

                        Dictionary properties = new Hashtable();
                        properties.put("path", aPath);
                        properties.put("replicationType", getReplicationType());
                        properties.put("userId", session.getUserID());
                        Event event = new Event("com/day/cq/wcm/workflow/req/for/activation", properties);
                        this.eventAdmin.sendEvent(event);
                    }
            } else {
                log.warn("Cannot activate page or asset because path is null for this workitem: " + workItem.toString());
            }
        } catch (RepositoryException e) {
            throw new WorkflowException(e);
        } catch (ReplicationException e) {
            throw new WorkflowException(e);
        } finally {
            if ((participantSession != null) && (participantSession.isLive())) {
                participantSession.logout();
                participantSession = null;
            }
        }
    }

我在获得例外的地方运行的代码:

com.google.appengine.api.modules.ModulesException: Unknown module
        at com.google.appengine.api.modules.ModulesServiceImpl$ModulesServiceFutureWrapper.convertApplicationException(ModulesServiceImpl.java:365)
        at com.google.appengine.api.modules.ModulesServiceImpl$ModulesServiceFutureWrapper.convertException(ModulesServiceImpl.java:352)
        at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:97)
        at com.google.appengine.api.modules.ModulesServiceImpl.getAsyncResult(ModulesServiceImpl.java:104)
        at com.google.appengine.api.modules.ModulesServiceImpl.getVersionHostname(ModulesServiceImpl.java:321)
        at com.peerke.outdoorpuzzlegame.backend.common.tasks.NotifyBackendTask.notifyBackendClients(NotifyBackendTask.java:51)
        at com.peerke.outdoorpuzzlegame.backend.common.tasks.NotifyBackendTask.notifyUpdateHighScores(NotifyBackendTask.java:28)
        at com.peerke.outdoorpuzzlegame.backend.gameclientendpoint.endpoints.ActiveGamesEndpoint.createTeam(ActiveGamesEndpoint.java:81)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:130)
        at com.google.api.server.spi.SystemService.invokeServiceMethod(SystemService.java:363)
        at com.google.api.server.spi.SystemServiceServlet.execute(SystemServiceServlet.java:113)
        at com.google.api.server.spi.SystemServiceServlet.doPost(SystemServiceServlet.java:71)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
        at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
        at com.googlecode.objectify.ObjectifyFilter.doFilter(ObjectifyFilter.java:48)
        at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
        at com.peerke.outdoorpuzzlegame.backend.common.gcp.GCPFilter.doFilter(GCPFilter.java:35)
        at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
        at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
        at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
        at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:128)
        at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)

1 个答案:

答案 0 :(得分:0)

我自己想通了。显然,有一种方法可以与本地开发服务器同时运行所有模块。然后它可以找出模块。

如果其他人想要这样做,请创建ear模块并将Gradle App Engine插件应用于该模块。