定时任务:
定义: queue.xml

<queue-entries>
<queue>
<name>default</name>
<rate>1/s</rate>
</queue>
<queue>
<name>mail-queue</name>
<rate>2000/d</rate>
<bucket-size>10</bucket-size>
</queue>
<queue>
<name>background-processing</name>
<rate>5/s</rate>
</queue>
</queue-entries>

 


如果想把一个任务增加到队列中,那么需要使用QueueFactory,然后使用add方法.

可以通过getQueue()方法得到queue.xml中定义的queue,也可以使用getDefaultQueue()方法来得到默认队列,然后使用add方法增加任务:

//默认队列将请求/worker,使用参数key=mykey

importcom.google.appengine.api.taskqueue.Queue;

importcom.google.appengine.api.taskqueue.QueueFactory;

importstatic com.google.appengine.api.taskqueue.TaskOptions.Builder.*;

Queuequeue = QueueFactory.getDefaultQueue();

queue.add(url("/worker").param("key",mykey))

 

例如:可以使用2url来完成一个事情:

Queuequeue = QueueFactory.getDefaultQueue();

queue.add(url("/path/to/my/worker"));

queue.add(url("/path?a=b&c=d").method(Method.GET));

 

定时任务的一个应用:RSS聚合:

一个feedreader需要定期,自动的去抓取各宗各样的feed的信息.一个单任务可能包含:

1.一个feedurl和最后一次check的时间戳

2.一个函数用来抓取内容,并分析处理,过滤内容.

 

通过配置安全访问,来屏蔽普通用户对于crontab专用的url进行反问

 

关于QueueURL:

如果不为crontab指定url,那么就会分配一个默认的url:/_ah/queue/queue_name

 

URL抓取服务:

App Engine 应用程序可以与其他应用程序进行通信或通过抓取网址访问网络上的其他资源。应用程序可以使用网址抓取服务来发出 HTTP 和 HTTPS 请求并接收响应。

用 java.net 抓取网址:

import java.net.MalformedURLException;
import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

// ...
        try {
            URL url = new URL("http://www.example.com/atom.xml");
            BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
            String line;

            while ((line = reader.readLine()) != null) {
                // ...
            }
            reader.close();

        } catch (MalformedURLException e) {
            // ...
        } catch (IOException e) {
            // ...
        }

提出请求

应用程序可以使用 HTTP(正常)或 HTTPS(安全)抓取网址。网址指定要使用的方案:http://... 或 https://...

网址必须使用标准的 HTTP (80) 和 HTTPS (443) 端口。

可以使用以下任何 HTTP 方法来抓取:GET(常用于请求网页和数据)、POST(常用于提交网络表单)、PUT、HEAD 和 DELETE。抓取可以包含 HTTP 请求标头和有效负载(HTTP 请求正文)。

 

为了防止应用程序造成请求的无限循环,不允许请求处理程序抓取其自身的网址。但其他做法仍然有可能造成无限循环,所以如果应用程序能够抓取由用户提供的对网址的请求,就要非常小心。

对网址抓取服务的调用是同步的,并且在服务接收来自远程主机的响应之前不会返回。应用程序的请求计时器可能会在远程主机作出响应之前走完。请求一旦发出便无法取消。

 

防火墙:

使用 Google 安全数据连接器 (SDC) 可以将您的应用程序连接到公司防火墙之后的系统。

以下是如何通过 java.net.HttpURLConnection 接口将网址抓取与 use_intranet 标头配合使用的示例:

import java.net.HttpURLConnection;
import java.net.URL;

// ...
        URL url = new URL("http://www.corp.example.com/sales.csv");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestProperty("use_intranet", "true");

 

对于网址的简单请求:

获取某网址的页面内容的一种简单方法是创建 java.net.URL 对象,然后调用其 openStream() 方法。该方法处理创建连接的详情,发出 HTTP GET 请求,然后检索响应数据。

import java.net.MalformedURLException;
import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

// ...
        try {
            URL url = new URL("http://www.example.com/atom.xml");
            BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
            String line;

            while ((line = reader.readLine()) != null) {
                // ...
            }
            reader.close();

        } catch (MalformedURLException e) {
            // ...
        } catch (IOException e) {
            // ...
        }

 

使用 HttpURLConnection:

对于更复杂的请求,您可以调用网址对象的 openConnection() 方法以获取 URLConnection 对象(HttpURLConnection 或 HttpsURLConnection,视网址而定)。在发出请求之前,您可以用更多信息准备此对象。要进行请求,请调用 URLConnection 上的方法,如 getInputStream() 或 getOutputStream()。

 

App Engine 的 URLConnection 实现不会与远程主机保持永久连接。当应用程序设置请求数据或写入输出流时,请求数据保存在内存中。当应用程序访问有关响应的任何数据时,如获得输入流(或调用 connect() 方法),App Engine 通过请求数据调用网址抓取服务,获得响应,关闭连接并返回响应数据。

以下示例通过某些表单数据对网址发出 HTTP POST 请求:

import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.OutputStreamWriter;

// ...
        String message = URLEncoder.encode("my message", "UTF-8");

        try {
            URL url = new URL("http://www.example.com/comment");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");

            OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
            writer.write("message=" + message);
            writer.close();
    
            if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                // OK
            } else {
                // Server returned HTTP error code.
            }
        } catch (MalformedURLException e) {
            // ...
        } catch (IOException e) {
            // ...
        }

设置请求标头:

要在传出请求上设置 HTTP 标头,请调用 HttpURLConnection 的 setRequestProperty() 方法。

connection.setRequestProperty("X-MyApp-Version", "2.7.3");

 

重定向:

默认情况下,HttpURLConnection 将遵循 HTTP 重定向。网址抓取服务将遵循最多 5 个重定向。

要禁用以下重定向,请调用 HttpURLConnection 的 setFollowRedirects() 方法。

connection.setFollowRedirects(false);

网址抓取服务不支持永久 HTTP 连接。当应用程序使用 URLConnection 对象访问响应数据时,App Engine 调用网址抓取服务来完成请求。在访问了响应数据之后,无法修改请求数据。

 

应用程序无法为请求设置显式连接超时。

posted on 2010-12-23 00:00  菊次郎  阅读(454)  评论(0)    收藏  举报