Java应用程序在appengine上的编程式备份

3

我希望能在GAE for Java上以编程方式运行备份作业。 所以我尝试将这里描述的代码移植到Appengine for Java上运行:

Queue queue = QueueFactory.getDefaultQueue();

String backendAddress = BackendServiceFactory.getBackendService().getBackendAddress("ah-builtin-python-bundle");
    TaskOptions taskOptions = withUrl("/_ah/datastore_admin/backup.create")
            .method(TaskOptions.Method.GET)
            .param("name", "Backup_Task")
            .param("filesystem", "gs")
            .param("gs_bucket_name", "backup_bkt")
            .param("queue", queue.getQueueName())
            .header("Host", backendAddress).
            .param("kind", "customer")
            .param("kind", "address")
 queue.add(taskOptions);

所有似乎都是正确的。当我运行上面的代码时,它将任务调用添加到推送队列中,但是在我的应用程序的默认版本上执行它,而不是在ah-builtin-python-bundle上执行,这显然会返回404。请参见下面的日志:
2013年10月2日15:58:27.315 /_ah/datastore_admin/backup.create?name=Backup_Task&filesystem=gs&gs_bucket_name=backup&queue=next-version&kind=address&kind=customer 404 26毫秒 0千字节 AppEngine-Google; (+http://code.google.com/appengine) 0.1.0.2 - - [02/Oct/2013:08:58:27 -0700] "GET /_ah/datastore_admin/backup.create?name=Backup_Task&filesystem=gs&gs_bucket_name=backup&queue=next-version&kind=address&kind=customer HTTP/1.1" 404 294 "http://version.myapp.appspot.com/tasks/backup" "AppEngine-Google; (+http://code.google.com/appengine)" "version.myapp.appspot.com" 毫秒=26 cpu_ms=47 cpm_usd=0.000033 queue_name=next-version task_name=3563633336363 app_engine_release=1.8.5 instance=xxxxxxxxxxxxxxx

我也看过这里的代码,它做了相同的事情,但我不确定它是否正常工作。

我想知道,我错过了什么?


嗨,我也遇到了同样的问题。你解决了吗? - doright
1个回答

5
我找到的解决方案如下所示:
Queue queue = QueueFactory.getQueue("backupQueue");
TaskOptions taskOptions = withUrl("/_ah/datastore_admin/backup.create")
            .method(TaskOptions.Method.GET)
            .param("name", 'Backuptask')
            .param("filesystem", "gs")
            .param("gs_bucket_name", BACKUP_BUCKET + '/' + DateTime.now().toString("yyyy/MM/dd/'" + nameSpace + "'-HH-mm"))
            .param("namespace", NamespaceManager.get();)
            .param("queue", queue.getQueueName())
            .param("kind", "customer")
            .param("kind", "address");
queue.add(taskOptions);

这个技巧是使用backupQueue队列,它会定向到ah-builtin-python-bundle。您可以通过将以下内容添加到queue.xml中来实现此目的: <queue> <!-- 用于备份任务的队列 --> <name>backupQueue</name> <rate>1/s</rate> <bucket-size>10</bucket-size> <max-concurrent-requests>3</max-concurrent-requests> <retry-parameters> <!-- 只重试一次 --> <task-retry-limit>2</task-retry-limit> </retry-parameters> <target>ah-builtin-python-bundle</target> </queue>

1
这太不可思议了!我们一直在苦苦挣扎,直到偶然发现了这个宝藏。你甚至可以遍历每个命名空间中的类型,并将它们添加到一起,以实现通用的命名空间备份/恢复功能。 - Shuky Capon
我们正在使用类似的东西,效果很好。现在下一个问题是如何获取待处理/正在运行的备份列表,以便避免重叠。你解决了这个问题吗? - BK-
唯一的方法是检查任务队列,这只能告诉您备份是否完成。这种方法的主要问题是,您无法按命名空间运行托管备份。 - husayt
我自己玩API时编写了几乎相同的Java代码。唯一的区别是我使用了defaultQueue,结果备份没有进行。像上面那样尝试使用不同的队列。 - Vinay Vemula

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接