GVKun编程网logo

Google App Engine Java世界中的MVC(google java style guide)

9

在本文中,您将会了解到关于GoogleAppEngineJava世界中的MVC的新资讯,同时我们还将为您解释googlejavastyleguide的相关在本文中,我们将带你探索GoogleAppEn

在本文中,您将会了解到关于Google App Engine Java世界中的MVC的新资讯,同时我们还将为您解释google java style guide的相关在本文中,我们将带你探索Google App Engine Java世界中的MVC的奥秘,分析google java style guide的特点,并给出一些关于Google App Engine / Java SDK在哪里存储logging和Blob?、Google App Engine for Java中的多对多关系(带有属性)、Google App Engine GAE - Java - 根据请求运行长进程、Google App Engine SDK for Java 1.3.2的实用技巧。

本文目录一览:

Google App Engine Java世界中的MVC(google java style guide)

Google App Engine Java世界中的MVC(google java style guide)

我是从C#和ASP.NET MVC来学习Java的,我很想在Java世界中找到可以在Google App
Engine上使用的等效语言。我已经开始玩FreeMarker,甚至迈出了编写一个非常简单的框架的第一步。理想情况下,虽然我不必做所有艰苦的工作,但一定有人已经做到了!所以我的问题是-
从ASP.NET MVC那里可以找到我熟悉的哪些框架,并且可以在Java的Google App Engine上使用它们。

我想要的关键是:

  • 简单路由 - /products/view/1以productid为1映射到产品控制器的视图操作
  • 模板引擎 -一种轻松地将“ ViewData”传递给视图并从视图轻松访问的方法,理想情况下,我希望避免使用XMLy太高的东西(因此,我喜欢FreeMarker)。

答案1

小编典典

我目前正在使用Spring MVC开发Google App Engine应用。它比ASP.NET
MVC成熟得多,因此您不要失望。另外,您还拥有Spring的全部IoC功能。

对于视图层,我正在尝试Velocity。这很简单,但是我还没有决定是否比JSP更喜欢它。我简要介绍了FreeMaker,但不喜欢我看到的内容。如果您想远离XML’y
JSP模板,我建议您试试Velocity。

我在GAE上使用Spring遇到的唯一问题是文件上传。MultipartResolver实现都依赖于临时文件目录。编写完自己的实现后,我将回到无缝上传模型中的文件。

Google App Engine / Java SDK在哪里存储logging和Blob?

Google App Engine / Java SDK在哪里存储logging和Blob?

Google App Engine / Java商店的SDK在哪里存储logging和blob?

我特别感兴趣的Windows SDK。

在手动和自动testing期间,我希望看到并清除数据。

理想情况下,还会有一个pipe理控制台的精简版本。

默认情况下,java应用程序引擎sdk在应用程序的WEB-INF/appengine-generated/子目录中存储local_db.bin在该目录的local_db.bin文件中存储数据存储记录。

您可以通过设置datastore.backing_store和blobstore.backing_store java属性来更改这些属性(请参阅LocalBlobstoreService.backing_STORE_PROPERTY和LocalDatastoreService.backing_STORE_PROPERTY )。

至于修剪管理控制台, 有一个 ,类似于Python的SDK。 启动java开发服务器并转到http:// localhost:8080 / _ah / admin 。

总结

以上是小编为你收集整理的Google App Engine / Java SDK在哪里存储logging和Blob?全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Google App Engine for Java中的多对多关系(带有属性)

Google App Engine for Java中的多对多关系(带有属性)

我从有关无主关系的官方文档中了解到,应用程序必须在关系的任一侧使用一组Key对象。这是很合理的。

但是,由于使用了多年的RDBM风格的编程,我对如何建模该关系本身的属性感到非常困惑。例如,如果我在多对多关系中具有实体 类别条目
,并且想保留dateAdded属性,或者某些其他数据(仅当关系的双方都已知时才相关)。

我想可以创建第三个类: CategoryEntry ,将两者链接在一起,但这似乎很麻烦。

为这种情况建模的建议方法是什么?

Google App Engine GAE - Java - 根据请求运行长进程

Google App Engine GAE - Java - 根据请求运行长进程

如何解决Google App Engine GAE - Java - 根据请求运行长进程?

我正在使用 GAE 创建一个 HTTPservlet,这是我编辑的代码:

@WebServlet(name = "DoGetMillionsRow",value = "/do-get-million-row")
public class DoGetMillionsRow extends HttpServlet{
    private static final Logger LOGGER = LoggerFactory.getLogger(DoGetMillionsRow.class);
    private final BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

    String projectId = "myprojectid";
    
    public DoGetMillionsRow() throws IOException {
    }

    @Override
    protected void doPost(HttpServletRequest req,HttpServletResponse resp) throws servletexception,IOException {
        try {
            Base64.Decoder decoder = Base64.getDecoder();
            String body = req.getReader().lines().collect(Collectors.joining(System.lineseparator()));
            ObjectMapper mapper = new ObjectMapper();
            MyCustomSpec spec = mapper.readValue(body,MyCustomSpec.class);
            CompletableFuture.runAsync(() ->
                    {
                        try {
                            doSomeProcess(spec);
                            LOGGER.info("CompletableFuture success");
                        } catch (Exception e) {
                            LOGGER.error("CompletableFuture error",e);
                        }
                    }
            );
                resp.setHeader("Access-Control-Allow-Origin","*");
                resp.setContentType("application/json");
                resp.setStatus(200);

                AmsApiResponse finalResponse = new AmsApiResponse(true,"success");
                resp.getWriter().write(new Gson().toJson(finalResponse));

        } catch (Exception e) {
            LOGGER.error("API Exception",e);
            resp.setStatus(400);
            resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        }
    }


    private boolean doSomeProcess(MyCustomSpec spec) throws APIException,ExecutionException,InterruptedException {
        List<Customresponse> result = getMyData(spec);
        sendDataToStackoverflow()
        return true;
    }
    
    private void sendDataToStackoverflow(List<Customresponse> spec){
        //SEND DATA TO STACKOVERFLOW
    }

    private List<Customresponse> getMyData(MyCustomSpec spec){
        List<String> result = new ArrayList<>();
        String query = "SELECT field1,field2 FROM `myProjectId.myDataSet.myTable` WHERE field3=@field3"
        QueryJobConfiguration queryConfig =
                QueryJobConfiguration.newBuilder(query)
                        .addNamedParameter("field3",QueryParameterValue.string(spec.getFilter))
                        .setUseLegacysql(false)
                        .setJobTimeoutMs(600000L)
                        .build();
        List<String> result = new ArrayList<>();
        LOGGER.info("progress 1 ");
        TableResult tableResult = getTableResult(bigquery,queryConfig);
        for (FieldValueList row : tableResult.iterateall()) {
            result.add(new Customresponse(
                    row.get("field1").getValue(),row.get("field").getValue()
            ));
        }
        LOGGER.info("progress 9 ");
        return result;
    }

private TableResult getTableResult(BigQuery bigquery,QueryJobConfiguration queryConfig) throws InterruptedException {
        LOGGER.info("progress 3");
        JobId jobId = JobId.of(UUID.randomUUID().toString());
        Job queryJob = bigquery.create(JobInfo.newBuilder(queryConfig).setJobId(jobId).build());
        queryJob = queryJob.waitFor();
        LOGGER.info("progress 4");

        if (queryJob == null) {
            LOGGER.info("progress 5");
            throw new RuntimeException("Job no longer exists");
        } else if (queryJob.getStatus().getError() != null) {
            LOGGER.info("progress 6");
            // You can also look at queryJob.getStatus().getExecutionErrors() for all
            // errors,not just the latest one.
            throw new RuntimeException(queryJob.getStatus().getError().toString());
        }
        LOGGER.info("progress 7");
        TableResult result = queryJob.getQueryResults();
        LOGGER.info("progress 8");
        return result;
    }


    @Override
    protected void doOptions(HttpServletRequest req,IOException {
        resp.setHeader("Access-Control-Allow-Origin","*");
        resp.setHeader("Access-Control-Allow-Methods","*");
        resp.setHeader("Access-Control-Allow-Headers","Authorization,Content-Type");
    }

}

在第一次尝试时,我没有使用 CompletableFuture runAsync,并且出现此错误

started at 2021/04/27 08:06:28.845 UTC 
and was still executing at 2021/04/27 08:07:33.165 UTC.
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:1030)
    at com.google.api.client.util.DataMap$EntryIterator.hasNext(DataMap.java:151)
    at com.google.api.client.util.GenericData$EntryIterator.hasNext(GenericData.java:269)
    at java.util.AbstractMap.containsKey(AbstractMap.java:153)

已经在网上做了一些研究,据说最大超时时间为 60 秒且不可更改

在第二次尝试中,我尝试了 runAsync 没有错误日志,进程正在运行,我得到了一些日志 但是最后一个日志是在“progress 3”上,之后的进程没有运行

仅供参考:

  1. 在 bigquery 控制台上查询需要 12 秒
  2. 查询过程大约2.4GB数据(未来应该是240GB或更多)
  3. 查询结果大约有 140k 行,当我将其下载为 json 文件时,数据大小为 (16mb)

有什么办法或解决方法吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Google App Engine SDK for Java 1.3.2

Google App Engine SDK for Java 1.3.2

Google App Engine 可让您在 Google 的基础架构上运行您的网络应用程序。App Engine 应用程序易于构建和维护,并可根据您的访问量和数据存储需要的增长轻松扩展。使用 Google App Engine,将不再需要维护服务器:您只需上传您的应用程序,它便可立即为您的用户提供服务.

下 载:Google App Engine SDK for Java 1.3.2

以下是该版本的发布说明:

App Engine Java SDK - Release Notes
Version 1.3.2 - March 25, 2010

  • New API to read the contents of uploaded Blobs (fetch_data)
  • http://code.google.com/p/googleappengine/issues/detail?id=2536
  • URLFetch now supports accessing ports 80-90, 440-450, and 1024-65535
  • Mail API now allows common document formats as attachments
  • http://code.google.com/p/googleappengine/issues/detail?id=494
  • The Task Queue API now supports adding multiple tasks in a single call to Queue.add()
  • Fixed charset handling for inbound emails
  • http://code.google.com/p/googleappengine/issues/detail?id=2326
  • Fixed issue with compositing background colors in dev_appserver
  • New feature in the datastore to specify whether to use strong or eventually consistent reads (the default is strong)
  • New datastore feature allows setting deadlines for operations
  • Increased the maximum Task Queue refill rate from 20/s to 50/s
  • Support for IP blacklisting to prevent denial of service (DoS) attacks
  • App Stats is now available for the Java SDK in addition to Python
  • Fix issue with expiration times not being reset on Put on the Memchache API
  • http://code.google.com/p/googleappengine/issues/detail?id=1284
  • Fix issue preventing static files from being served when a servlet is mapped to root
  • http://code.google.com/p/googleappengine/issues/detail?id=1379

JDO/JPA Changes

  • Support default rpc deadlines and query-specific deadlines
  • Support default read consistency config and query-specific read consistency config

我们今天的关于Google App Engine Java世界中的MVCgoogle java style guide的分享就到这里,谢谢您的阅读,如果想了解更多关于Google App Engine / Java SDK在哪里存储logging和Blob?、Google App Engine for Java中的多对多关系(带有属性)、Google App Engine GAE - Java - 根据请求运行长进程、Google App Engine SDK for Java 1.3.2的相关信息,可以在本站进行搜索。

本文标签: