2016-07-20 52 views
1

我創建了一個spring引導web服務(provider)應用程序。我在請求中傳遞了一個timewait選項。如果timewait = n的值,我必須將響應編程爲延遲很多時間,即n秒/毫秒。有沒有辦法做到這一點? XSD如下:Spring Boot - 將延遲添加到要顯示的SOAP響應中

<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> 

回答

1

您可以使用Thread.sleep(n)

我假設「n」的值是以秒爲單位的。

  Integer seconds = n; 

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


//return your response here 

如果你想集中式這種「拖延」的代碼,那麼你可以創建一個DelayFilter像下面。

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

是的。我使用Thread.sleep()方法來執行此操作。完美的作品。謝謝。 – Anirban

+2

這種技術有一個壞的一面。有人可能會開始向您發送大量請求 - >您在tomcat/jetty線程池中的所有線程都會進入睡眠狀態 - >服務器關閉。因此,在分離的線程池中睡覺可能是一個好主意。 –

+0

@vadim_shb,好想法 –