在@Async 函数完成之前返回值
returning value before @Async funtion is complete
嗨,我有一个控制器需要调用另一个控制器,并且 return 在另一个控制器完成之前调用一个值。
@EnableAsync
@Controller
public class InitController {
private static final Logger logger = LoggerFactory
.getLogger(InitController.class);
@Value("${init.hostname}")
private String base_url;
@RequestMapping(value = "/rest/init/{id}", method = RequestMethod.GET)
public @ResponseBody
String initialize(@PathVariable String id) throws Fault_Exception {
try {
Future<String> result = customerAsync(id);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Async
private Future<String> customerAsync(String id) throws Fault_Exception, IOException{
URL url = new URL(base_url + "rest/customer/" + id);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
if (conn.getResponseCode() != 200 ) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}
conn.disconnect();
return new AsyncResult<String>(null);
}
}
现在发生的事情是,当我调用 InitController 时,它会在 returning null 之前等待,直到 /rest/customer/ 控制器完成。
除非您使用 aspectj,否则 Spring 不会为私有方法创建代理,因此在您的示例中,同步调用 customerAsync
方法。
解决你的问题最简单的方法是提取customerAsync
方法来分离@Component
注解class.
另外 @EnableAsync
注释应该用在 @Configuration
class 而不是控制器上。
嗨,我有一个控制器需要调用另一个控制器,并且 return 在另一个控制器完成之前调用一个值。
@EnableAsync
@Controller
public class InitController {
private static final Logger logger = LoggerFactory
.getLogger(InitController.class);
@Value("${init.hostname}")
private String base_url;
@RequestMapping(value = "/rest/init/{id}", method = RequestMethod.GET)
public @ResponseBody
String initialize(@PathVariable String id) throws Fault_Exception {
try {
Future<String> result = customerAsync(id);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Async
private Future<String> customerAsync(String id) throws Fault_Exception, IOException{
URL url = new URL(base_url + "rest/customer/" + id);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
if (conn.getResponseCode() != 200 ) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}
conn.disconnect();
return new AsyncResult<String>(null);
}
}
现在发生的事情是,当我调用 InitController 时,它会在 returning null 之前等待,直到 /rest/customer/ 控制器完成。
除非您使用 aspectj,否则 Spring 不会为私有方法创建代理,因此在您的示例中,同步调用 customerAsync
方法。
解决你的问题最简单的方法是提取customerAsync
方法来分离@Component
注解class.
另外 @EnableAsync
注释应该用在 @Configuration
class 而不是控制器上。