简短回答:代码很好,我只需要将TaskExecutor规范移动到具有spring-servlet定义(和async-support stuff)的相同配置文件中。
当DeferredResult经历其超时时,该错误似乎是默认值。
我的第一个故障排除是增加超时 - 这增加了我在收到错误之前等待的时间。这似乎表明请求正确进入异步模式并且正在返回DeferredResult(并且没有生成错误),但是在超时设置之前没有调用setResult。
所以,我在@Scheduled方法中放了一些打印语句,果然,没有发生任何事情。上面的原始问题中有两部分XML。第一个是在我的spring.xml配置文件中,第二个是在一个单独的applicationConfig.xml文件中。我把它们都放在spring文件中然后就可以了。
我相信最终错误是基于spring.xml文件中组件扫描的范围。这一次又烧毁了我。这变得深奥但相当简单 - 我们使用spring-security和PasswordEncoder来加密和散列密码。出于范围原因,我无法在具有组件扫描的文件中指定PasswordEncoder配置,该组件扫描会触及它所使用的DAO(违反直觉)。因此,我们总共有3个XML配置文件,其中2个包含组件扫描和排除过滤器,以确保它们不重叠。偶尔我会将一些配置放在错误的文件中,并且组件扫描中的类无法访问它。如果我能弄清楚如何只有一个组件扫描它将解决所有这一切,但偶尔会出现这样的事情。