I have the following in my controller, in a Spring-Boot application:
@RequestMapping(method=RequestMethod.GET,value="/info")
public DataModel getinfodata()
{
//this method runs some script which takes more than 3 minutes and sends the response back
return run_xyz()
}
In my angular app, I have this:
export class FetchService {
private _url:string="/info";
constructor(private _http:Http) { }
getData():any
{
return this._http.get(this._url).map((res:Response)=>res.json()).
catch(this.errorHandler).subscribe(data=>console.log(data));
}
errorHandler(error: Response){
console.error(error);
return Observable.throw(error || "Server Error");
}
The issue I am facing currently is that the Http get
is making silent retries to the server, and as result, my expensive script is getting called 3 or 4 times. Is there an approach by which the get
will make only a single request with 0 retries and wait until the script is completed and then the response should be sent back.I am calling the getData method only once.
Snapshot of response from backend Snapshot of Tomcat running on port 8080 Snapshot of server response in normal case, when the script is not running Angular CLI Final Response after 189 seconds
Eventually, I figured out why it is happening The dev-server makes use
http-proxy-middleware package
More Here and the proxy options provided in this package is from underlyinghttp-proxy library
http-proxy options. one among them isThe default value is ~120 seconds(based on my observations) if the server fails to respond within the stipulated time(120s) a new request is made to the server. overriding the default timeout with
"timeout":30000
in proxy config file resolved the issue.The http observable makes an http request for each subscriber. So the 3 to 4 http request means you must have multiple components subscribing at the same time. To share a single http request for multiple observers, you need something like the share operator.
Now the multiple observers will share the same observable.
As for your
ERR_EMPTY_RESPONSE
issue. I've run into this when my proxied api call timesout.