2016-07-20 5 views
1

Ich habe eine Spring Boot Webservice (Provider) -Anwendung erstellt. Ich gebe eine Zeitwarte-Option in Anfrage. Wenn der Wert von timewait = n ist, muss ich die Antwort so programmieren, dass sie um so viel Zeit verzögert wird, dh n Sekunden/Millisekunden. Kann ich das irgendwie machen? XSD unten angegeben:Spring Boot - Hinzufügen Verzögerung zu SOAP Antwort angezeigt werden

<xs:element name="asyncServerRequest"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="header" type="xs:string"/> 
      <xs:element name="BSID" type="xs:string"></xs:element> 
      <xs:element name="encodedString" type="xs:string"></xs:element> 
      <xs:element name="timewait" type="xs:int"></xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:element name="asyncServerResponse"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="responsecode" type="xs:int"/> 
      <xs:element name="reponsemessage" type="xs:string"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Antwort

1

Sie Thread.sleep(n) verwenden können.

Ich nehme an, "n" Wert ist in Sekunden.

  Integer seconds = n; 

      try { 
       Thread.sleep(seconds*1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 


//return your response here 

Wenn Sie zentralisieren diese "Verzögerung" Code möchten, dann können Sie eine DelayFilter wie unten erstellen.

import java.io.IOException; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class DelayFilter implements Filter { 



private static final String DELAY_PARAMETER = "n"; 


    public void destroy() { 
     // TODO Auto-generated method stub 

    } 

    public void doFilter(ServletRequest req, ServletResponse resp, 
      FilterChain chain) throws IOException, ServletException { 

     HttpServletRequest request = (HttpServletRequest) req; 

     //get delay value (DELAY_PARAMETER or n) from your request 
     String delay = request.getParameter(DELAY_PARAMETER); 

    if (delay!=null && !"".equals(delay)) { 
     Integer seconds = Integer.valueOf(delay); 

      try { 
       Thread.sleep(seconds*1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
} 



     HttpServletResponse response = (HttpServletResponse) resp; 
     response.setHeader("Cache-Control", "no-cache, must-revalidate"); 
     chain.doFilter(req, resp); 


    } 

    public void init(FilterConfig arg0) throws ServletException { 
     // TODO Auto-generated method stub 

    } 

} 
+0

Ja. Ich habe den Thread.sleep() Weg verwendet, um dies zu tun. Funktioniert perfekt. Vielen Dank. – Anirban

+2

Es gibt eine schlechte Seite dieser Technik. Jemand könnte beginnen, Ihnen viele Anfragen zu senden -> alle Ihre Threads in tomcat/jetty threadpool geht schlafen -> Server ist ausgefallen. Es ist also wahrscheinlich eine gute Idee, in einem separaten Threadpool zu schlafen. –

+0

@ vadim_shb, guter Gedanke –