突然将appengine devmode任务请求拒绝到0.0.0.0

时间:2011-11-01 20:10:08

标签: java google-app-engine

更新:当我为项目禁用GWT时,这个问题就消失了!

我很高兴在appengine中使用任务队列好几个月了,在我的Mac OS X机器上开发模式测试非常棒。

今天,一切都崩溃了。

[ERROR] Job CleanupQueue.task1 threw an unhandled Exception: 
com.google.apphosting.api.ApiProxy$ApplicationException: ApplicationError: 2: Received exception executing http method POST against URL http://0.0.0.0:8888/tasks/cleanup: Connection to http://0.0.0.0:8888 refused
    at com.google.appengine.api.urlfetch.dev.LocalURLFetchService.fetch(LocalURLFetchService.java:381)
    at com.google.appengine.api.taskqueue.dev.LocalTaskQueue$UrlFetchServiceLocalTaskQueueCallback.execute(LocalTaskQueue.java:480)
    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)
[ERROR] Job (CleanupQueue.task1 threw an exception.
org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: com.google.apphosting.api.ApiProxy$ApplicationException: ApplicationError: 2: Received exception executing http method POST against URL http://0.0.0.0:8888/tasks/cleanup: Connection to http://0.0.0.0:8888 refused]
    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: 2: Received exception executing http method POST against URL http://0.0.0.0:8888/tasks/cleanup: Connection to http://0.0.0.0:8888 refused
    at com.google.appengine.api.urlfetch.dev.LocalURLFetchService.fetch(LocalURLFetchService.java:381)
    at com.google.appengine.api.taskqueue.dev.LocalTaskQueue$UrlFetchServiceLocalTaskQueueCallback.execute(LocalTaskQueue.java:480)
    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)

我没有更改项目中的任何内容,恢复到以前工作的版本也无济于事。 0.0.0.0是来自开发服务器的内部IP - 我的所有其他引用都使用localhost或127.0.0.1。我最近从Apple安装了一些操作系统更新,但我会发誓开发模式在当时和现在之间都有效。

我在哪里可以开始寻找原因?谢谢你的任何想法 - 我很难过!

注意:我的Windows机器上的相同代码和设置效果很好。

注2:从头开始使用GAE java sdk 1.5.5,我制作了最简单的taskqueue示例应用程序并获得了相同的连接拒绝消息。

额外信息

的ifconfig:

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
    inet6 ::1 prefixlen 128 
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
    inet 127.0.0.1 netmask 0xff000000 
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether c8:2a:14:0d:d8:e8 
    inet 192.168.2.1 netmask 0xffffff00 broadcast 192.168.2.255
    media: autoselect (none)
    status: inactive
fw0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 4078
    lladdr 70:cd:60:ff:fe:6a:28:ae 
    media: autoselect <full-duplex>
    status: inactive
en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 78:ca:39:b4:c3:8a 
    inet6 fe80::7aca:39ff:feb4:c38a%en1 prefixlen 64 scopeid 0x6 
    inet 192.168.2.3 netmask 0xffffff00 broadcast 192.168.2.255
    media: autoselect
    status: active

4 个答案:

答案 0 :(得分:3)

我没有看到这个问题(运行Python SDK,任务在我们的MacOS X环境中本地工作),但您是否尝试过切换来监听所有IP?

传 --address 0.0.0.0 在启动程序中的额外标志应该绑定到所有,并允许您使用localhost或您的实际IP。当然,不应该,但你可以尝试作为实验。

您是否将明确的目标传递给任务?您的应用是否在非默认端口8888上运行?

ifconfig的输出是什么样的?是否有任何虚拟适配器或其他网络设备在发生故障时发生了变化?

答案 1 :(得分:1)

您不应将0.0.0.0用作连接目标。 0.0.0.0具有特殊含义:它指的是所有IP地址(想象它是。*。*)。这通常在将侦听套接字绑定到所有可用接口时使用。

因此,即使侦听套接字绑定到0.0.0.0,也不应该使用相同的ip连接到它。通常,您可以连接到环回IP 127.0.0.1或您的活动公共IP(在win中检查ipconfig或在linux中检查ifconfig)。

不同的应用程序和操作系统可能以不同的连接目标处理0.0.0.0。这可以解释为什么它在您的Firefox中有效。

答案 2 :(得分:1)

0.0.0.0是一种特殊的地址。在此上下文中,它表示“本地计算机上的所有IP地址(IPv4)”。因此,如果您的appengine正在侦听端口8888,这意味着它已绑定到所有可用的IP地址。因此,从您的配置中,它应该可以在localhost( 127.0.0.1:8888 ), 192.168.2.1:8888 192.168.2.3:8888 。您可以验证尝试类似:

telnet 192.168.2.1 8888

首先,您不应该将其作为IP地址传递。

如果您有权访问以下内容,请检查http://localhost:8888/_ah/admin/ 当服务器正在运行时。

从appengine的版本&gt; = 2.0.1开始,devmode的默认行为是它将仅绑定到localhost。为了绑定或所有可用的IPv4地址(a.k.a.0.0.0.0),您(或者如果程序通过某些预定义配置自动监视,例如Eclipse)必须指定 -bindAddress 0.0.0.0 。如果你检查你的Eclipse Run配置 - 参数 - 程序参数,如果你从Eclipse运行它可能会有用,这引导我们进入下一个问题。你如何启动应用程序引擎?有两个选项,请注意

“使用Google Plugin for Eclipse从Eclipse中启动开发服务器时,服务器默认使用端口8888 。使用dev_appserver命令启动服务器时,默认使用端口8080 。“

您提到您已完成操作系统的升级。我发现这个issue与JDK更新有关,但讨论的版本是 Java SE 6 Update 4 。我认为值得在此提及。另外我们应该假设,在更新之后,没有防火墙升级使其自动启动,对吗?

我还建议在ant-macros.xml中检查你的配置,看看有什么值:

<attribute name="port" default="8080" description="The port the server starts on"/>
<attribute name="address" default="localhost" description="The interface the server binds to"/>

答案 3 :(得分:0)

我解决了这个问题。

从eclipse启动GWT&amp; GAE项目的类是com.google.appengine.tools.development.gwt.AppEngineLauncher。这个类硬编码0.0.0.0作为要绑定的IP,根据注释应该使它在所有接口上监听。

我刚刚将此类中的代码复制到AppEngineLauncherHack类中,该类对更具体的IP(在我的情况下为192.168.0.12)进行硬编码,并将我的运行配置更改为使用此类而不是

我还没弄清楚最终的冲突是什么。我不知道为什么0.0.0.0曾经工作过,但现在不行了。不满意,肯定是一个kluge - 如果这开始在其他机器上发生,我们将不得不为每台计算机创建一个新的AELauncherHack类!但至少现在我们可以恢复生意了。

感谢大家的帮助 - 对不起,我只能将赏金奖励给一个人!