2017-03-01 68 views
-1

我已經經歷了很多線程,但沒有得到關於如何在任何Web服務調用上實現線程池的具體解決方案,其中創建了REST服務。需要幫助來實現Java中REST Web服務的線程池

就給人一種高層次的想法 -

1)調用Web服務,通​​過servlet的 2)來的servlet擊中Web服務的每個請求都應該放在隊列中,如果事先請求未被完全與處理返回響應 3)假設應用程序服務器啓動並在8080端口上運行,我很難實現線程池給出的錯誤 - java.net.BindException:已在使用的地址:JVM_Bind 4)我不確定如何處理它端到端的請求隊列中的Web服務調用在servlet中

下面是代碼描述 -

1)一個servlet類的doPost()調用我的REST服務

HttpClient httpClient = HttpClientBuilder.create().build(); 
    String requrl = "http://myappserver:8080/TestApp/test/testExecute.service"; 

    String jsonvalue = "{\"param1\":\"value1"," + 
         "\"param2\":\"value2\"}"; 

    LOG.info("json value: " + jsonvalue); 

    HttpPost postRequest = new HttpPost(requrl); 

    String message = jsonvalue; 

    StringEntity input = new StringEntity(message); 

    input.setContentType("application/json"); 

    postRequest.setEntity(input); 

    HttpResponse response = httpClient.execute(postRequest); 

2)Web服務 -

import java.io.Serializable; 

import org.codehaus.jackson.annotate.JsonPropertyOrder; 

import org.codehaus.jackson.annotate.JsonWriteNullProperties; 

import org.codehaus.jackson.map.annotate.JsonSerialize; 

@JsonWriteNullProperties(false) 

@JsonPropertyOrder({ 
     "param1", 
     "param2" 
    }) 

public class TestExecuteRequest implements Serializable { 

     private static final long serialVersionUID = 1L; 

     @JsonSerialize(include=JsonSerialize.Inclusion.ALWAYS) 
     protected String param1; 
     @JsonSerialize(include=JsonSerialize.Inclusion.ALWAYS) 
     protected String param2; 

     /** 
     * @return the param1 
     */ 
     public String getParam1() { 
      return param1; 
     } 
     /** 
     * @param param1 the param1 to set 
     */ 
     public void setParam1(String param1) { 
      this.param1 = param1; 
     } 
     /** 
     * @return the param2 
     */ 
     public String getParam2() { 
      return param2; 
     } 
     /** 
     * @param param2 the param2 to set 
     */ 
     public void setParam2(String param2) { 
      this.param2 = param2; 
     } 
    } 

Class having web service definition - 

import javax.ws.rs.Consumes; 

import javax.ws.rs.POST; 

import javax.ws.rs.Path; 

import javax.ws.rs.Produces; 

import javax.ws.rs.core.Response; 

import org.jboss.resteasy.annotations.providers.jaxb.Formatted; 

@Path("test") 

public interface TestFrame { 

    @POST 

    @Consumes("application/json") 

    @Formatted 

    @Produces("application/json") 

    @Path("/testExecute.service") 

    Response executeTestSuite(TestExecuteRequest testExeRequest); 

} 

Web service performing some operations in TestService class 

public class TestService implements TestFrame { 

    // Logic to perform all operations after web service has been called 

} 

誰能幫助我,在哪裏在上述任何一個類中寫入線程池,以便在servlet中調用上述Web服務時,可以一個接一個地處理請求?

希望你的幫助。

謝謝 MN

回答

0

首先嚐試解決「端口已經使用」不相關的線程錯誤。

這是我很難實現線程池給錯誤 - java.net.BindException:地址已在使用:JVM_Bind

這意味着你的端口已經被另一個進程使用。您可以使用netstat命令查看哪個進程正在使用您的端口。如果你是一個Linux機器上嘗試這個

netstat -annp | grep 8080 

注意,-p標誌會給你正在使用8080端口的進程的ID。

+0

對不起,提到更多的細節,我嘗試了一個小任務的ThreadPool邏輯可用在互聯網上,這並沒有解決我的問題,並給了我BindException。這就是我提供所有代碼細節的原因,請從頭開始解釋我如何處理處理多個Web服務調用請求所需的隊列或線程池。 – user3896624

+0

您可以在執行executeTestSuite中添加以下內容嗎?打印當前線程名稱以檢查您的容器是否已經爲您創建多個線程。 – nono