繁体   English   中英

Java中的数据存储区导出逻辑

Datastore export logic in Java

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

值得庆幸的是,Google宣布了来自Cloud Datastore的导出逻辑。 我想在我的平台上设置schedule-export。 但是,它不是Python,而是Java。 因此,我需要使用cron.xml和Java逻辑来设计此逻辑。

是否有参考资料说明Java中的设计数据存储区导出逻辑(cloud_datastore_admin.py)? 特别是,我需要用Java转换这部分

app = webapp2.WSGIApplication(
[
    ('/cloud-datastore-export', Export),
], debug=True)

https://cloud.google.com/datastore/docs/schedule-export

3 个回复

您可以按照以下说明为App Egnine创建框架。

有了骨架后,添加如下代码来处理导出请求:

CloudDatastoreExport.java

package com.google.example.datastore;

import com.google.appengine.api.appidentity.AppIdentityService;
import com.google.appengine.api.appidentity.AppIdentityServiceFactory;
import com.google.apphosting.api.ApiProxy;
import com.google.common.io.CharStreams;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Logger;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONTokener;

@WebServlet(name = "CloudDatastoreExport", value = "/cloud-datastore-export")
public class CloudDatastoreExport extends HttpServlet {

  private static final Logger log = Logger.getLogger(CloudDatastoreExport.class.getName());

  @Override
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {

    // Verify outputURL parameter
    String outputUrlPrefix = request.getParameter("output_url_prefix");

    if (outputUrlPrefix == null || !outputUrlPrefix.matches("^gs://.*")) {
      response.setStatus(HttpServletResponse.SC_CONFLICT);
      response.setContentType("text/plain");
      response.getWriter().println("Error: Must provide a valid output_url_prefix.");

    } else {

      // Get project ID
      String projectId = ApiProxy.getCurrentEnvironment().getAppId();
      // Remove partition information to get plain app ID
      String appId = projectId.replaceFirst("(.*~)", "");

      // Get access token
      ArrayList<String> scopes = new ArrayList<String>();
      scopes.add("https://www.googleapis.com/auth/datastore");
      final AppIdentityService appIdentity = AppIdentityServiceFactory.getAppIdentityService();
      final AppIdentityService.GetAccessTokenResult accessToken =
          appIdentity.getAccessToken(scopes);

      // Read export parameters
      // If output prefix does not end with slash, add a timestamp
      if (!outputUrlPrefix.substring(outputUrlPrefix.length() - 1).contentEquals("/")) {
        String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
        outputUrlPrefix = outputUrlPrefix + "/" + timeStamp + "/";
      }

      String[] namespaces = request.getParameterValues("namespace_id");
      String[] kinds = request.getParameterValues("kind");

      // Build export request
      JSONObject exportRequest = new JSONObject();
      exportRequest.put("output_url_prefix", outputUrlPrefix);

      JSONObject entityFilter = new JSONObject();

      if (kinds != null) {
        JSONArray kindsJSON = new JSONArray(kinds);
        entityFilter.put("kinds", kinds);
      }

      if (namespaces != null) {
        JSONArray namespacesJSON = new JSONArray(namespaces);
        entityFilter.put("namespaceIds", namespacesJSON);
      }

      exportRequest.put("entityFilter", entityFilter);

      URL url = new URL("https://datastore.googleapis.com/v1/projects/" + appId + ":export");
      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
      connection.setDoOutput(true);
      connection.setRequestMethod("POST");
      connection.addRequestProperty("Content-Type", "application/json");
      connection.addRequestProperty("Authorization", "Bearer " + accessToken.getAccessToken());

      OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
      exportRequest.write(writer);
      writer.close();

      if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {

        JSONTokener exportResponseTokens = new JSONTokener(connection.getInputStream());
        JSONObject exportResponse = new JSONObject(exportResponseTokens);

        response.setContentType("text/plain");
        response.getWriter().println("Export started:\n" + exportResponse.toString(4));

      } else {
        InputStream s = connection.getErrorStream();
        InputStreamReader r = new InputStreamReader(s, StandardCharsets.UTF_8);
        String errorMessage =
            String.format(
                "got error (%d) response %s from %s",
                connection.getResponseCode(), CharStreams.toString(r), connection.toString());
        log.warning(errorMessage);
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        response.setContentType("text/plain");
        response.getWriter().println("Failed to initiate export.");
      }
    }
  }
}

您可以从文档中使用相同的cron.yaml

cron:
- description: "Daily Cloud Datastore Export"
  url: /cloud-datastore-export?namespace_id=&output_url_prefix=gs://BUCKET_NAME[/NAMESPACE_PATH]
  target: cloud-datastore-admin
  schedule: every 24 hours

使用gcloud部署cron作业:

gcloud app deploy cron.yaml

确保完成此部分以授予GAE导出和存储桶权限,否则您将获得权限拒绝错误:

https://cloud.google.com/datastore/docs/schedule-export#before_you_begin

您显示的代码片段只是特定于第一代标准环境python应用程序的典型GAE应用程序框架的一部分。 您可以在python quickstart Hello World代码审查main.py部分中轻松识别它。

该代码初始化app变量(来自main python模块,即main.py文件),该main.pyapp.yaml处理程序配置中作为script: main.app引用。

相应的Java应用程序框架明显不同,请参见Java快速入门《 Hello World代码评论》 但是不用担心,您不必专门转换该代码段,只需构建Java应用程序框架并关注应用程序处理程序实际执行的操作-向数据存储区发出这些POST请求。 抱歉,我无济于事,但我不是Java用户。

我真正意识到的是app.yaml就像Java中的Web.xml一样,而cloud-datastore-export是一个与gae通信以导出数据的servlet,但是我不能做更多的事情

1 等待数据存储导出作业完成

我正在按照 Google Cloud 文档安排从 Cloud Functions 中的数据存储区导出作业。 https://cloud.google.com/datastore/docs/schedule-export 上面的响应对象包含一个定义操作状态的字段。 如果操作仍在进行中,它会 ...

3 了解数据存储导出中的输出文件

我们需要将我们的数据存储数据库从 Google Cloud 导出到我们的本地开发环境。 我设法将其导出并将其保存在存储的文件夹中。 但是,有一百多个文件被命名为:“output-{number}”。 我不清楚我们是否必须使用所有这些才能在本地导入数据库,或者我只需要这些输出之一。 创建的导出具有以 ...

7 Mongodb导出有条件逻辑?

我要导出“街道”:“下街34” 但是,如果源值不是3,则不要导出 示例1 JSON “ addresses”:[{“ source”:3,“ street”:“ Downstreet 34”}] 导出“街道”:“下街34” 示例2 JSON “ addres ...

8 导出数据逻辑

我的场景: 我对导出数据有疑问。 我有一个运行复杂查询的PHP脚本,该查询需要一些时间才能返回数据。 当我得到数据时,我便向用户提供了数据,他们可以根据需要导出数据。 我的逻辑 为了避免在用户导出数据时重新运行查询,我使用查询返回的数据设置了一个Session变量,如果 ...

10 Android Java 中的首选项数据存储

我刚刚在 kotlin 中实现了首选项数据存储,现在我正在尝试在 Java 中实现数据存储首选项,包括加密和解密存储以及数据检索。 寻找任何参考。 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM