Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用谷歌应用程序引擎';s(Java)任务队列以在一个实体中保留大量数据/行_Java_Google App Engine_Task Queue - Fatal编程技术网

如何使用谷歌应用程序引擎';s(Java)任务队列以在一个实体中保留大量数据/行

如何使用谷歌应用程序引擎';s(Java)任务队列以在一个实体中保留大量数据/行,java,google-app-engine,task-queue,Java,Google App Engine,Task Queue,我试图在一个实体(例如雇员)中保留大约28000行 基本上,我的目标是通过使用超过30秒的put来避免被终止/超时——如果我通过调用发送到servlet的doPost()请求来执行28000次put,就会发生这种情况 因此,我正在考虑使用谷歌应用程序引擎文档中描述的任务 基本上,我想上传一个包含28000名“员工”的war目录中的csv文件。然后创建一个任务,将这28000个员工行异步放入员工实体 问题1:这是一个可行的解决方案还是有更好的方法?同样,我们的目标是执行看跌期权,以避免由于30秒

我试图在一个实体(例如雇员)中保留大约28000行

基本上,我的目标是通过使用超过30秒的put来避免被终止/超时——如果我通过调用发送到servlet的doPost()请求来执行28000次put,就会发生这种情况

因此,我正在考虑使用谷歌应用程序引擎文档中描述的任务

基本上,我想上传一个包含28000名“员工”的war目录中的csv文件。然后创建一个任务,将这28000个员工行异步放入员工实体

  • 问题1:这是一个可行的解决方案还是有更好的方法?同样,我们的目标是执行看跌期权,以避免由于30秒的限制而终止

  • 问题2:我应该使用什么queue.xml配置来确保我可以尽可能快地执行这些put

  • 问题3:现在,我已经尝试过了,类似于博客条目:但在大约23秒后,我发现以下错误:

    SEVERE: Job default.task1 threw an unhandled Exception: 
    com.google.apphosting.api.ApiProxy$ApplicationException: ApplicationError: 5: http method POST against URL http://127.0.0.1:8888/dotaskservlet timed out.
        at com.google.appengine.api.urlfetch.dev.LocalURLFetchService.fetch(LocalURLFetchService.java:236)
        at com.google.appengine.api.taskqueue.dev.LocalTaskQueue$UrlFetchServiceLocalTaskQueueCallback.execute(LocalTaskQueue.java:471)
        at com.google.appengine.api.taskqueue.dev.UrlFetchJob.execute(UrlFetchJob.java:77)
        at org.quartz.core.JobRunShell.run(JobRunShell.java:203)
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
    16/02/2011 12:12:55 PM org.quartz.core.ErrorLogger schedulerError
    SEVERE: Job (default.task1 threw an exception.
    org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: com.google.apphosting.api.ApiProxy$ApplicationException: ApplicationError: 5: http method POST against URL http://127.0.0.1:8888/dotaskservlet timed out.]
        at org.quartz.core.JobRunShell.run(JobRunShell.java:214)
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
    * Nested Exception (Underlying Cause) ---------------
    com.google.apphosting.api.ApiProxy$ApplicationException: ApplicationError: 5: http method POST against URL http://127.0.0.1:8888/dotaskservlet timed out.
        at com.google.appengine.api.urlfetch.dev.LocalURLFetchService.fetch(LocalURLFetchService.java:236)
        at com.google.appengine.api.taskqueue.dev.LocalTaskQueue$UrlFetchServiceLocalTaskQueueCallback.execute(LocalTaskQueue.java:471)
        at com.google.appengine.api.taskqueue.dev.UrlFetchJob.execute(UrlFetchJob.java:77)
        at org.quartz.core.JobRunShell.run(JobRunShell.java:203)
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
    
  • 问题4:我还检查了位于的数据存储查看器,它似乎只在该实体中创建了1000个结果。1000是上限吗

  • 问题5:我如何消除上述错误

  • 问题6:能否确认任务允许的最长时间是10分钟?还是30秒?我确实来过这里:


如果你的目标只是自己上传一堆数据,而不是让你的用户这么做,我认为批量上传器是一个更简单的工具。您可以从本地计算机上运行一个python程序,该程序负责请求限制和故障恢复


以下是一个使用mapreduce解析CSV文件的示例/教程,似乎与您的需要类似:


我会通过
delferredtask
进行批量保存,大致如下:

List<Employee> employees=...
EmployeeWriter qr = new EmployeeWriter (employees);
TaskHandle task = QueueFactory.getDefaultQueue().add(withPayload(qr));
列出员工=。。。
EmployeeWriter qr=新的EmployeeWriter(员工);
TaskHandle task=QueueFactory.getDefaultQueue().add(带有效负载(qr));
在哪里

公共类EmployeeWriter实现延迟任务{
公共EmployeeWriter(){}
公共雇员编撰人(雇员名单){
this.employees=新的LinkedList(员工);
}
私人LinkedList员工;
@凌驾
公开募捐{
Stopwatch sw=Stopwatch.createStarted();
试一试{
做{
List employeesTosave=Pull100 EmployeesFromLinkedList(员工)
ofy().save(employeesTosave.now();
}时间(经过的软件(时间单位分钟)<9);
最后{
sw.stop();
如果(!employees.isEmpty()){
QueueFactory.getDefaultQueue().add(withPayload(this));
}
}
}

Btw,我认为您误解了实体的概念。每个“实体”都是一个“种类”的实例(就像Java中的对象是类,就像数据库中的行是表)。我想你的意思是你想创建28000个员工类型的实体?例如,请看,是的,你的假设是正确的。很抱歉使用了糟糕的/混合的术语。由于我一直在使用GAE和Java,所以这篇博客文章看起来更难应用。我已经通读了它,但它仍然看起来很陌生。我已经阅读并更好地理解了ho与pyhton works合作的w GAE。因此,我将在我第一次尝试后给出:
public class EmployeeWriter implements DeferredTask {
   public EmployeeWriter () {    }
   public EmployeeWriter (List<Employee> employees) { 
          this.employees=new LinkedList(employees);  
   }

    private LinkedList<Employee> employees;

    @Override
    public void run() {
      Stopwatch sw = Stopwatch.createStarted();
      try {
        do {
           List employeesTosave=Pull100EmployeesFromLinkedList(employees)
           ofy().save(employeesTosave).now();

        } while (sw.elapsed(TimeUnit.MINUTES) < 9);
     finally {
        sw.stop();
        if (!employees.isEmpty()) {
            QueueFactory.getDefaultQueue().add(withPayload(this));
        }
    }

}