英文:
How to call rest api and do not wait any response
问题
我有这段代码
private Boolean doSomething() {
// 一些代码
this.sync();
return true;
}
public void sync() {
RestTemplate restTemplate = restTemplate();
restTemplate.exchange(batchHost, HttpMethod.GET, header(), String.class);
}
我不需要来自REST调用的数据。它是批处理执行服务,需要时间。但对于我的 doSomething
函数,我不需要从 sync
获取响应以继续。
今天,当REST调用不可用时...我的 doSomething
函数...什么都不做...
如何调用REST服务,但在没有错误的情况下继续执行 doSomething()
?
谢谢
我使用Java 11。
英文:
I have this code
private Boolean doSomething() {
// SOME CODE
this.sync();
return true;
}
public void sync() {
RestTemplate restTemplate = restTemplate();
restTemplate.exchange(batchHost, HttpMethod.GET, header(), String.class);
}
I don't need data from the rest call. it's batch execution service he take times. but for my doSomething
function i don't need a response from sync
to continue.
Today, when the rest call not working, not available... my function doSomething .... do nothing...
How to call rest service but continue without error doSomething()
without errors ??
Thanks
I use java 11
答案1
得分: 4
你可以将`sync`方法调用变成异步的。Spring提供了简单的方法来实现这一点。在你的任何配置类中(即带有`@Configuration`注解的类)添加`@EnableAsync`。如果你找不到任何配置类,则在带有`@SpringBootApplication`注解的类中添加`@EnableAsync`。
@SpringBootApplication
@EnableAsync
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
然后在你的sync
方法上添加@Async
注解。你的代码将会是这样的。
@Async
public void sync() {
RestTemplate restTemplate = restTemplate();
restTemplate.exchange(batchHost, HttpMethod.GET, header(), String.class);
}
为了让@Async
起作用,需要从另一个类文件中调用这个sync
方法。如果你从同一个类中调用sync
,那么sync
方法将不会是异步的。
<details>
<summary>英文:</summary>
You can make the `sync` method call asynchronous. Spring provides easy way to do that. Add `@EnableAsync` in any of you Configuration class (i.e. Classes annotated with `@Configuration`). If you don't find any configuration class then add `@EnableAsync` in the class with `@SpringBootApplication`.
@SpringBootApplication
@EnableAsync
public class SpringbootApplication{
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
Then add `@Async` to your `sync` method. Your code will look like this.
@Async
public void sync() {
RestTemplate restTemplate = restTemplate();
restTemplate.exchange(batchHost, HttpMethod.GET, header(), String.class);
}
To make `@Async` work, this `sync` method need to be called from another class file. If you call `sync` from same class then sync method will not be asynchronous.
</details>
# 答案2
**得分**: 0
你不应该使用 RestTemplate 来调用 REST API。
"请考虑使用 org.springframework.web.reactive.client.WebClient,它具有更现代的API,并支持同步、异步和流式场景。"
链接:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html
<details>
<summary>英文:</summary>
You should not use RestTemplate to call REST API.
"Please, consider using the org.springframework.web.reactive.client.WebClient which has a more modern API and supports sync, async, and streaming scenarios."
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html
</details>
# 答案3
**得分**: 0
如果您不希望从异步运行的方法中得到响应,那么您可以按照以下方式在触发端点中直接在`completableFuture`的lambda方法中执行异步部分,然后立即返回 200 OK。请注意,如果内部方法可能会抛出异常,您也需要在try/catch中捕获它,以确保它也以异步方式发生。
```java
@GetMapping(value = "/trigger")
public ResponseEntity<String> triggerMethod() throws Exception {
CompletableFuture.runAsync(() -> {
try {
this.dosomething();
} catch(Exception e) {
e.printStackTrace();
}
});
return new ResponseEntity<String>(HttpStatus.OK);
}
但是,如果您需要通过其他异步方法获得响应,则需要实现类似于这个示例中的方法。
英文:
If you dont want a response from the methods you run async, then You can simply do the async portion inside completableFuture
lambda method as follows, directly in your triggering endpoint and return 200 ok immediately. Note, if internal method may throw exceptions, you need to swallow that too in a try/catch to ensure it happens asynch. as well.
<!-- language: java -->
@GetMapping(value = "/trigger")
public ResponseEntity<String> triggerMethod() throws Exception {
CompletableFuture.runAsync(() -> {
try {
this.dosomething();
} catch(Exception e) {e.printStackTrace();}
});
return new ResponseEntity<String>(HttpStatus.OK);
}
However, if you require a response through other methods run asynchronously, then you will need to implement something like this example
答案4
得分: 0
你可以使用 Spring WebFlux 以反应式和非阻塞的方式构建或消费 API。以下是官方文档,详细解释了这一点:https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html。
英文:
You can use Spring WebFlux to build or consume API's in reactive and non-blocking manners.
Here is the official documentation which explains this in detail:
https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论