Hi,

I am writing a singleton class (Object in scala) which uses apache
httpclient(4.5.2) to send some file or some json content to a server and
return status to caller. Here is my class -

    object HttpUtils{
      protected val retryHandler = new HttpRequestRetryHandler() {
        def retryRequest(exception: IOException, executionCount: Int,
context: HttpContext): Boolean = {
          //retry logic
          true
        }
      }
      private val connectionManager = new
PoolingHttpClientConnectionManager()

      // Reusing same client for each request that might be coming from
different threads .
      // Is it correct ????
      val httpClient = HttpClients.custom()
        .setConnectionManager(connectionManager)
        .setRetryHandler(retryHandler)
        .build()

      def restApiCall (url : String, rDD: RDD[SomeMessage]) : Boolean = {
        // Creating new context for each request
        val httpContext: HttpClientContext = HttpClientContext.create
        val post = new HttpPost(url)

        // convert RDD to text file using rDD.collect

        // add this file as MultipartEntity to post

        var response = None: Option[CloseableHttpResponse] // Is it correct
way of using it ???
        try {
          response = Some(httpClient.execute(post, httpContext))
          val responseCode = response.get.getStatusLine.getStatusCode
          EntityUtils.consume(response.get.getEntity) // Is it require ???
          if (responseCode == 200) true
          else false
        }
        finally {
          if (response.isDefined) response.get.close
          post.releaseConnection() // Is it require ???
        }
      }
      def onShutDown = {
        connectionManager.close()
        httpClient.close()
      }
    }


Multiple threads (More specifically from spark streaming context) are
calling `restApiCall` method. I am relatively new to `scala` and `apache
httpClient`. I have to make frequent connections to only few fixed server
(i.e. 5-6 fixed URL's with different request parameters). I have also
written comments in above code as question. Please address them as well.

I went through multiple online resource but still not confident about it.

 - Is it the best way to use http client in multi-threaded environment?
 - Is it possible to keep live connections and use it for various requests
? Will it be beneficial in this case ?
 - Am i using/releasing all resources efficiently ? If not please suggest.
 - Is it good to use it in Scala or there exist some better library ?

 Thanks for your help in advance.


-- 
Nishant Kumar
Bangalore, India
Mob: +91 80088 42030
Email: nishantkuma...@gmail.com

Reply via email to