2016-03-30 15 views
0

Ich konfrontiert mit einem bestimmten Problem: Mein Ruhe-Controller funktioniert für einige Stunden, als ich nicht weiß, warum, wenn ich eine Anfrage an sie. Es reagiert nicht. Ladeprozess im Browser wartet auf eine Antwort für eine Weile. Wenn ich eine Anfrage mit einem POST senden möchte, kann ich sehen, dass diese Anfrage an den Controller ging, aber keine Antwort erhalten hat. Ich habe versucht, App zu debuggen, ich habe einige geplante verarbeitet - sie arbeiten. Aber Controller nicht. Die Anfrage erreicht den Controller nicht. Es blieb vorher hängen. Wie kann ich herausfinden, wo das passiert? Vielen Dank. Das ist meine Controller-Klasse:Feder MVC Controller stucked und nicht reagiert

@RestController 
@RequestMapping("/quotes") 
public class QuotesController { 

private final QuotesService quotesService; 

@Autowired 
public QuotesController(QuotesService quotesService) { 
    this.quotesService = quotesService; 
} 

@RequestMapping(value="", method= RequestMethod.GET, produces = "application/json; charset=utf-8") 
public ResponseEntity<List<LoadedFileInfo>> getLoadedFilesData(){ 
    List<LoadedFileInfo> result = quotesService.getLoadedFilesData(); 
    return new ResponseEntity<List<LoadedFileInfo>>(result, HttpStatus.OK); 
} 

@RequestMapping(value="/currencyPairs", method= RequestMethod.GET, produces = "application/json; charset=utf-8") 
public ResponseEntity<List<CurrencyPair>> getCurrencyPairs(){ 
    return new ResponseEntity<List<CurrencyPair>>(quotesService.getCurrencyPairs(), HttpStatus.OK); 
} 

@RequestMapping(value="/oneMinute", method= RequestMethod.GET, produces = "application/json; charset=utf-8") 
public ResponseEntity<List<Number[]>> getOneMinuteQuotes(@RequestParam @DateTimeFormat(iso= DateTimeFormat.ISO.DATE_TIME) LocalDateTime from, @RequestParam @DateTimeFormat(iso= DateTimeFormat.ISO.DATE_TIME) LocalDateTime to, @RequestParam Integer currencyPair){ 
    return new ResponseEntity<List<Number[]>>(quotesService.getOneMinuteQuotes(from, to, currencyPair), HttpStatus.OK); 
} 

@RequestMapping(value="/fiveMinutes", method= RequestMethod.GET, produces = "application/json; charset=utf-8") 
public ResponseEntity<List<Number[]>> getFiveMinutesQuotes(@RequestParam @DateTimeFormat(iso= DateTimeFormat.ISO.DATE_TIME) LocalDateTime from, @RequestParam @DateTimeFormat(iso= DateTimeFormat.ISO.DATE_TIME) LocalDateTime to, @RequestParam Integer currencyPair){ 
    return new ResponseEntity<List<Number[]>>(quotesService.getFiveMinuteQuotes(from, to, currencyPair), HttpStatus.OK); 
} 

@RequestMapping(value="/fifteenMinutes", method= RequestMethod.GET, produces = "application/json; charset=utf-8") 
public ResponseEntity<List<Number[]>> getFifteenMinutesQuotes(@RequestParam @DateTimeFormat(iso= DateTimeFormat.ISO.DATE_TIME) LocalDateTime from, @RequestParam @DateTimeFormat(iso= DateTimeFormat.ISO.DATE_TIME) LocalDateTime to, @RequestParam Integer currencyPair){ 
    return new ResponseEntity<List<Number[]>>(quotesService.getFifteenMinuteQuotes(from, to, currencyPair), HttpStatus.OK); 
} 

@RequestMapping(value="/thirtyMinutes", method= RequestMethod.GET, produces = "application/json; charset=utf-8") 
public ResponseEntity<List<Number[]>> getThirtyMinutesQuotes(@RequestParam @DateTimeFormat(iso= DateTimeFormat.ISO.DATE_TIME) LocalDateTime from, @RequestParam @DateTimeFormat(iso= DateTimeFormat.ISO.DATE_TIME) LocalDateTime to, @RequestParam Integer currencyPair){ 
    return new ResponseEntity<List<Number[]>>(quotesService.getThirtyMinuteQuotes(from, to, currencyPair), HttpStatus.OK); 
} 

@RequestMapping(value="/oneHour", method= RequestMethod.GET, produces = "application/json; charset=utf-8") 
public ResponseEntity<List<Number[]>> getOneHourQuotes(@RequestParam @DateTimeFormat(iso= DateTimeFormat.ISO.DATE_TIME) LocalDateTime from, @RequestParam @DateTimeFormat(iso= DateTimeFormat.ISO.DATE_TIME) LocalDateTime to, @RequestParam Integer currencyPair){ 
    return new ResponseEntity<List<Number[]>>(quotesService.getOneHourQuotes(from, to, currencyPair), HttpStatus.OK); 
} 

@RequestMapping(value="/fourHours", method= RequestMethod.GET, produces = "application/json; charset=utf-8") 
public ResponseEntity<List<Number[]>> getFourHourQuotes(@RequestParam @DateTimeFormat(iso= DateTimeFormat.ISO.DATE_TIME) LocalDateTime from, @RequestParam @DateTimeFormat(iso= DateTimeFormat.ISO.DATE_TIME) LocalDateTime to, @RequestParam Integer currencyPair){ 
    return new ResponseEntity<List<Number[]>>(quotesService.getFourHourQuotes(from, to, currencyPair), HttpStatus.OK); 
} 

@RequestMapping(value="/oneDay", method= RequestMethod.GET, produces = "application/json; charset=utf-8") 
public ResponseEntity<List<Number[]>> getOneDayQuotes(@RequestParam @DateTimeFormat(iso= DateTimeFormat.ISO.DATE_TIME) LocalDateTime from, @RequestParam @DateTimeFormat(iso= DateTimeFormat.ISO.DATE_TIME) LocalDateTime to, @RequestParam Integer currencyPair){ 
    return new ResponseEntity<List<Number[]>>(quotesService.getOneDayQuotes(from, to, currencyPair), HttpStatus.OK); 
} 

@RequestMapping(value="/oneWeek", method= RequestMethod.GET, produces = "application/json; charset=utf-8") 
public ResponseEntity<List<Number[]>> getOneWeekQuotes(@RequestParam @DateTimeFormat(iso= DateTimeFormat.ISO.DATE_TIME) LocalDateTime from, @RequestParam @DateTimeFormat(iso= DateTimeFormat.ISO.DATE_TIME) LocalDateTime to, @RequestParam Integer currencyPair){ 
    return new ResponseEntity<List<Number[]>>(quotesService.getOneWeekQuotes(from, to, currencyPair), HttpStatus.OK); 
} 

@RequestMapping(value="/oneMonth", method= RequestMethod.GET, produces = "application/json; charset=utf-8") 
public ResponseEntity<List<Number[]>> getOneMonthQuotes(@RequestParam @DateTimeFormat(iso= DateTimeFormat.ISO.DATE_TIME) LocalDateTime from, @RequestParam @DateTimeFormat(iso= DateTimeFormat.ISO.DATE_TIME) LocalDateTime to, @RequestParam Integer currencyPair){ 
    return new ResponseEntity<List<Number[]>>(quotesService.getOneMonthQuotes(from, to, currencyPair), HttpStatus.OK); 
} 

}

+0

helfen kann, ist es für alle Controller oder nur eine? Sehen Sie Fehler in den Protokollen? Hast du einen Thread-Dump versucht? Hast du eine visualVM angeschlossen? Welcher Anwendungsserver? –

+0

Es ist ein SpringBoot. Ich habe nur einen Controller. Es gibt keine Fehler in den Protokollen.Ich habe Thread-Dump nicht ausprobiert und VisualVM nicht verbunden – migAlex

+0

Können Sie Controller-Code, den Sie für den REST erstellt haben, veröffentlichen. – srinivas

Antwort

0

Ich glaube nicht, dass es etwas falsch mit Ihrem Controller ist, zumindest gibt es keine Beweise dafür in dem bereitgestellten Code. Es gibt eine Menge Gründe, was hier schief gehen kann, um nur einige zu nennen:

  • HTTP Connection Pool ist voll Ein Webserver, läuft Ihre Anwendung eine Verbindungspool - eine Anzahl verfügbarer HTTP Verbindungen. Es sei denn, Sie verwenden ein asynchrones Zeug (ich nehme an, Sie nicht), ist es möglich, dass der Pool nur mit einer Vielzahl von Verbindungen, die parallel ausgeführt werden und versucht, auf den Controller zuzugreifen, überwältigt wird.

    Überprüfen Sie zuerst, dass der Verbindungspool in Ordnung ist, normalerweise stellen Verbindungspools eine Art von Management dar. Zum Beispiel gibt es einen JMX in Tomcat), loggen Sie sich also mit jconsole ein und stellen Sie sicher, dass es viele freie Verbindungen gibt.

  • Es gibt ein gelegentliches Netzwerkproblem Dieser ist wirklich einfach herauszufinden. Fügen Sie am Anfang Ihres Controllers einige Trace-Nachrichten hinzu und protokollieren Sie sie. Überprüfen Sie dann das Protokoll und sehen Sie, ob bei jeder Anfrage eine neue Nachricht angezeigt wird. Wenn Sie dies tun, wird der Code ordnungsgemäß aufgerufen.

  • Der Fehler ist in der Anwendung selbst In diesem Fall sollten Sie sehen, dass es altert für Controller-Methode nimmt die Strömung (wieder, Spuren mit Protokollen zu Beginn und am Ende der Controller-Methode zu vervollständigen kann helfen). Um dies zu beweisen, sollten Sie einen Thread-Dump erstellen. Es gibt viele Möglichkeiten, dies zu tun, zum Beispiel: Wenn Sie auf Linux sind, führen Sie kill -3 auf Ihrem Java-Prozess, alternativ können Sie jstack verwenden, so finden Sie einfach, was am besten für Sie funktioniert. Wie auch immer, ein Thread-Dump sollte zeigen, wo Ihre Anwendung zu einem bestimmten Zeitpunkt hängen bleibt. Also, wenn Sie es nehmen, zweimal sagen und immer noch sehen, dass der Faden verantwortlich für die Steuerung der Ausführung ist die gleiche Stelle stecken - Sie Glück einer :)

Von dass Sie das Anwendungsprofil können und verstehen, wo Genau die Zeit wird ausgegeben, aber das sollte "offline" geschehen und ich glaube nicht an eine Produktionsmaschine.

Sorry, wenn diese Antwort zu einfach klingt, aber da Sie haben nicht wirklich jede Art von Analyse wie das habe ich versucht habe angenommen, dass eine solche Erklärung

+0

Vielen Dank für diese Erklärung. Es gibt viele hilfreiche Informationen. Will versuchen, es zu analysieren und zu verwenden. Vielen Dank – migAlex