Hi,

I investigated that following function blocks threads when I invoke
service several times.
Is it necessary to call recv function? (see below)

-----axis2_network_handler.c-----
AXIS2_EXTERN axis2_status_t  AXIS2_CALL
axis2_network_handler_close_socket (const axis2_env_t *env,
axis2_socket_t socket)
{
    int i = 0;
    char buf[32];
   AXIS2_ENV_CHECK(env, AXIS2_CRTICAL_FAILURE);
   if(socket < 0)
   {
      AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_SOCKET,
                     AXIS2_FAILURE);
      return AXIS2_FAILURE;
   }
    shutdown(socket, AXIS2_SHUT_WR);
    i = recv(socket, buf, 32, 0);<----------"If no incoming data is
available at the socket, the recv call blocks and waits for data to
arrive"
    AXIS2_CLOSE_SOCKET(socket);
   return AXIS2_SUCCESS;
}
-----axis2_network_handler.c-----

---
Best regards,
Evgeniy

> -----Original Message-----
> From: Ryzhov, Evgeny [mailto:[EMAIL PROTECTED] 
> Sent: Saturday, June 24, 2006 1:38 PM
> To: [email protected]
> Subject: [Axis2] Client which can invoke service several times
> 
> Hi,
>  
> I have tried to realize client which can invoke service several times.
> And I have determined that some resources(threads on service 
> side, tcp connections and memory on both side) stay in use 
> after service invocation have completed. I'm using 
> axis2_http_server.exe from version 0.92.
> Could you explain me how I have to free resources correctly, please?
> Examples which were modified in order to have multiple 
> invocation are applied below (mtom and echo).
>                                       
> ---
> Best regards,
> Evgeniy
> 
> ---mtom.c---http://localhost/axis2/services/mtomn---------
> /*
>  * Copyright 2004,2005 The Apache Software Foundation.
>  *
>  * Licensed under the Apache License, Version 2.0 (the "License");
>  * you may not use this file except in compliance with the License.
>  * You may obtain a copy of the License at
>  *
>  *      http://www.apache.org/licenses/LICENSE-2.0
>  *
>  * Unless required by applicable law or agreed to in writing, software
>  * distributed under the License is distributed on an "AS IS" BASIS,
>  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
> express or implied.
>  * See the License for the specific language governing permissions and
>  * limitations under the License.
>  */
> #include <stdio.h>
> #include <axiom.h>
> #include <axis2_util.h>
> #include <axiom_soap.h>
> #include <axis2_client.h>
> axiom_node_t *
> build_om_programatically(const axis2_env_t *env, 
>     const axis2_char_t *image_name, 
>     const axis2_char_t *to_save_name);
> int main(int argc, char** argv)
> {
>     const axis2_env_t *env = NULL;
>     const axis2_char_t *address = NULL;
>     axis2_endpoint_ref_t* endpoint_ref = NULL;
>     axis2_options_t *options = NULL;
>     const axis2_char_t *client_home = NULL;
>     axis2_svc_client_t* svc_client = NULL;
>     axiom_node_t *payload = NULL;
>     axiom_node_t *ret_node = NULL;
>     const axis2_char_t *image_name = "resources/axis2.jpg";  
> const axis2_char_t *to_save_name = "D:/tmp/test.jpg";
>    
>     /* Set up the environment */
>     env = axis2_env_create_all("mtom.log", AXIS2_LOG_LEVEL_TRACE);
>     /* Set end point reference of mtom service */
>     address = "http://localhost/axis2/services/mtomn";;
>     if (argc > 1 )
>         address = argv[1];
>     if (AXIS2_STRCMP(address, "-h") == 0)
>     {
>         printf("Usage : %s [endpoint_url] [image_name] 
> [to_save_name]\n", argv[0]);
>         printf("use -h for help\n");
>         return 0;
>     }
>     if (argc > 2)
>         image_name = argv[2];
>     if (argc > 3)
>         to_save_name = argv[3];
>     printf ("Using endpoint : %s\n", address);
>     /* Set up deploy folder. It is from the deploy folder, 
> the configuration is picked up 
>      * using the axis2.xml file.
>      * In this sample client_home points to the Axis2/C 
> default deploy folder. The client_home can 
>      * be different from this folder on your system. For 
> example, you may have a different folder 
>      * (say, my_client_folder) with its own axis2.xml file. 
> my_client_folder/modules will have the 
>      * modules that the client uses
>      */
>     client_home = AXIS2_GETENV("AXIS2C_HOME");
>     if (!client_home)
>         client_home = "../../deploy";
>  while(1)
>  {
>   /* Create EPR with given address */
>   endpoint_ref = axis2_endpoint_ref_create(env, address);
>   /* Setup options */
>   options = axis2_options_create(env);
>   AXIS2_OPTIONS_SET_TO(options, env, endpoint_ref);
>   AXIS2_OPTIONS_SET_SOAP_VERSION(options, env, AXIOM_SOAP11);
>   AXIS2_OPTIONS_SET_ENABLE_MTOM(options, env, AXIS2_TRUE);
>   /* Create service client */
>   svc_client = axis2_svc_client_create(env, client_home);
>   if (!svc_client)
>   {
>    printf("Error creating service client\n");
>    AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Stub invoke 
> FAILED: Error code:"
>     " %d :: %s", env->error->error_number,
>     AXIS2_ERROR_GET_MESSAGE(env->error));
>   }
>   /* Set service client options */
>   AXIS2_SVC_CLIENT_SET_OPTIONS(svc_client, env, options);    
>   /* Engage addressing module */
>   AXIS2_SVC_CLIENT_ENGAGE_MODULE(svc_client, env, 
> AXIS2_MODULE_ADDRESSING);
>   /* Build the SOAP request message payload using OM API.*/
>   payload = build_om_programatically(env, image_name, to_save_name);
>   /* Send request */
>   ret_node = AXIS2_SVC_CLIENT_SEND_RECEIVE(svc_client, env, payload);
>   if( payload )
>   {
>    AXIOM_NODE_FREE_TREE(payload, env);
>    payload = NULL;
>   }
>   if(ret_node)
>   {
>    axis2_char_t *om_str = NULL;
>    om_str = AXIOM_NODE_TO_STRING(ret_node, env);
>    if (om_str)
>     printf("\nReceived OM : %s\n", om_str);
>    printf("\nmtom client invoke SUCCESSFUL!\n");
>    AXIOM_NODE_FREE_TREE(ret_node, env);
>    ret_node = NULL;
>   }
>   else
>   {
>    AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Stub invoke 
> FAILED: Error code:"
>     " %d :: %s", env->error->error_number,
>     AXIS2_ERROR_GET_MESSAGE(env->error));
>    printf("mtom client invoke FAILED!\n");
>   }
>   if (svc_client)
>   {
>    AXIS2_SVC_CLIENT_FREE(svc_client, env);
>    svc_client = NULL;
>   }
>   if (endpoint_ref)
>   {
>    AXIS2_ENDPOINT_REF_FREE(endpoint_ref, env);
>    endpoint_ref = NULL;
>   }
>  }
>     return 0;
> }
> /* build SOAP request message content using OM */ 
> axiom_node_t * build_om_programatically(const axis2_env_t *env, 
>     const axis2_char_t *image_name, 
>     const axis2_char_t *to_save_name)
> {
>     axiom_node_t *mtom_om_node = NULL;
>     axiom_element_t* mtom_om_ele = NULL;
>     axiom_node_t* image_om_node = NULL;
>     axiom_element_t * image_om_ele = NULL;
>     axiom_node_t* file_om_node = NULL;
>     axiom_element_t * file_om_ele = NULL;
>     axiom_node_t* data_om_node = NULL;
>     axiom_text_t * data_text = NULL;
>     axiom_namespace_t *ns1 = NULL;
>     axiom_data_handler_t *data_handler = NULL;
>     
>     ns1 = axiom_namespace_create (env, 
> "http://ws.apache.org/axis2/c/samples/mtom";, "ns1");
>     mtom_om_ele = axiom_element_create(env, NULL, 
> "mtomSample", ns1, &mtom_om_node);
>     
>     file_om_ele = axiom_element_create(env, mtom_om_node, 
> "fileName", ns1, &file_om_node);
>     AXIOM_ELEMENT_SET_TEXT(file_om_ele, env, to_save_name, 
> file_om_node);
>     image_om_ele = axiom_element_create(env, mtom_om_node, 
> "image", ns1, &image_om_node);
>     data_handler = axiom_data_handler_create(env, image_name, 
> "image/jpeg");
>     data_text = axiom_text_create_with_data_handler(env, 
> image_om_node, data_handler, &data_om_node);
>     return mtom_om_node;
> }
> 
> ---echo.c---http://localhost/axis2/services/echon---------
> /*
>  * Copyright 2004,2005 The Apache Software Foundation.
>  *
>  * Licensed under the Apache License, Version 2.0 (the "License");
>  * you may not use this file except in compliance with the License.
>  * You may obtain a copy of the License at
>  *
>  *      http://www.apache.org/licenses/LICENSE-2.0
>  *
>  * Unless required by applicable law or agreed to in writing, software
>  * distributed under the License is distributed on an "AS IS" BASIS,
>  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
> express or implied.
>  * See the License for the specific language governing permissions and
>  * limitations under the License.
>  */
> #include <stdio.h>
> #include <axiom.h>
> #include <axis2_util.h>
> #include <axiom_soap.h>
> #include <axis2_client.h>
> axiom_node_t *
> build_om_payload_for_echo_svc(const axis2_env_t *env);
> 
> int main(int argc, char** argv)
> {
>  const axis2_env_t *env = NULL;
>  const axis2_char_t *address = NULL;
>  const axis2_char_t *client_home = NULL;
>  /* Set up the environment */
>  env = axis2_env_create_all("echon.log", AXIS2_LOG_LEVEL_TRACE);
>  /* Set up deploy folder. It is from the deploy folder, the 
> configuration is picked up
>  * using the axis2.xml file.
>  * In this sample client_home points to the Axis2/C default 
> deploy folder. The client_home can
>  * be different from this folder on your system. For example, 
> you may have a different folder
>  * (say, my_client_folder) with its own axis2.xml file. 
> my_client_folder/modules will have the
>  * modules that the client uses
>  */
>  client_home = AXIS2_GETENV("AXIS2C_HOME");  if (!client_home)
>   client_home = "../../deploy";
>  /* Set end point reference of echo service */  address = 
> "http://localhost/axis2/services/echon";;
>  if (argc > 1 )
>   address = argv[1];
>  if (AXIS2_STRCMP(address, "-h") == 0)
>  {
>   printf("Usage : %s [endpoint_url]\n", argv[0]);
>   printf("use -h for help\n");
>   return 0;
>  }
>  printf ("Using endpoint : %s\n", address);
>  while(1)
>  {
>   axis2_endpoint_ref_t* endpoint_ref = NULL;
>   axis2_options_t *options = NULL;
>   axis2_svc_client_t* svc_client = NULL;
>   axiom_node_t *payload = NULL;
>   axiom_node_t *ret_node = NULL;
>   /* Create EPR with given address */
>   endpoint_ref = axis2_endpoint_ref_create(env, address);
>   /* Setup options */
>   options = axis2_options_create(env);
>   AXIS2_OPTIONS_SET_TO(options, env, endpoint_ref);
>   AXIS2_OPTIONS_SET_ACTION(options, env,
>    "http://ws.apache.org/axis2/c/samples/echoString";);
>   /* Create service client */
>   svc_client = axis2_svc_client_create(env, client_home);
>   if (!svc_client)
>   {
>    printf("Error creating service client\n");
>    AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Stub invoke 
> FAILED: Error code:"
>     " %d :: %s", env->error->error_number,
>     AXIS2_ERROR_GET_MESSAGE(env->error));
>   }
>   /* Set service client options */
>   AXIS2_SVC_CLIENT_SET_OPTIONS(svc_client, env, options);    
>   /* Engage addressing module */
>   AXIS2_SVC_CLIENT_ENGAGE_MODULE(svc_client, env, 
> AXIS2_MODULE_ADDRESSING);
>   /* Build the SOAP request message payload using OM API.*/
>   payload = build_om_payload_for_echo_svc(env);
> 
>   /* Send request */
>   ret_node = AXIS2_SVC_CLIENT_SEND_RECEIVE(svc_client, env, payload);
>   if(ret_node)
>   {
>    axis2_char_t *om_str = NULL;
>    om_str = AXIOM_NODE_TO_STRING(ret_node, env);
>    if (om_str)
>     printf("-->[%s]\n", om_str);
>    //printf("\necho client invoke SUCCESSFUL!\n");
>   }
>   else
>   {
>    AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Stub invoke 
> FAILED: Error code:"
>     " %d :: %s", env->error->error_number,
>     AXIS2_ERROR_GET_MESSAGE(env->error));
>    printf("echo client invoke FAILED!\n");
>   }
>   if (svc_client)
>   {
>    AXIS2_SVC_CLIENT_FREE(svc_client, env);
>    svc_client = NULL;
>   }
>   if (endpoint_ref)
>   {
>    AXIS2_ENDPOINT_REF_FREE(endpoint_ref, env);
>    endpoint_ref = NULL;
>   }
>   //break;
>  }
>  return 0;
> }
> int main1(int argc, char** argv)
> {
>     const axis2_env_t *env = NULL;
>     const axis2_char_t *address = NULL;
>     axis2_endpoint_ref_t* endpoint_ref = NULL;
>     axis2_options_t *options = NULL;
>     const axis2_char_t *client_home = NULL;
>     axis2_svc_client_t* svc_client = NULL;
>     axiom_node_t *payload = NULL;
>     axiom_node_t *ret_node = NULL;
>    
>     /* Set up the environment */
>     env = axis2_env_create_all("echo.log", AXIS2_LOG_LEVEL_TRACE);
>     /* Set end point reference of echo service */
>     address = "http://localhost/axis2/services/echon";;
>     if (argc > 1 )
>         address = argv[1];
>     if (AXIS2_STRCMP(address, "-h") == 0)
>     {
>         printf("Usage : %s [endpoint_url]\n", argv[0]);
>         printf("use -h for help\n");
>         return 0;
>     }
>     printf ("Using endpoint : %s\n", address);
>     
>     /* Create EPR with given address */
>     endpoint_ref = axis2_endpoint_ref_create(env, address);
>     /* Setup options */
>     options = axis2_options_create(env);
>     AXIS2_OPTIONS_SET_TO(options, env, endpoint_ref);
>     AXIS2_OPTIONS_SET_ACTION(options, env,
>         "http://ws.apache.org/axis2/c/samples/echoString";);
>     /* Set up deploy folder. It is from the deploy folder, 
> the configuration is picked up 
>      * using the axis2.xml file.
>      * In this sample client_home points to the Axis2/C 
> default deploy folder. The client_home can 
>      * be different from this folder on your system. For 
> example, you may have a different folder 
>      * (say, my_client_folder) with its own axis2.xml file. 
> my_client_folder/modules will have the 
>      * modules that the client uses
>      */
>     client_home = AXIS2_GETENV("AXIS2C_HOME");
>     if (!client_home)
>         client_home = "../../deploy";
>     /* Create service client */
>     svc_client = axis2_svc_client_create(env, client_home);
>     if (!svc_client)
>     {
>         printf("Error creating service client\n");
>         AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Stub invoke 
> FAILED: Error code:"
>                   " %d :: %s", env->error->error_number,
>                         AXIS2_ERROR_GET_MESSAGE(env->error));
>     }
>     /* Set service client options */
>     AXIS2_SVC_CLIENT_SET_OPTIONS(svc_client, env, options);    
>     
>     /* Engage addressing module */
>     AXIS2_SVC_CLIENT_ENGAGE_MODULE(svc_client, env, 
> AXIS2_MODULE_ADDRESSING);
>     
>     /* Build the SOAP request message payload using OM API.*/
>     payload = build_om_payload_for_echo_svc(env);
>     
>     /* Send request */
>     ret_node = AXIS2_SVC_CLIENT_SEND_RECEIVE(svc_client, env, 
> payload);
>     
>     if(ret_node)
>     {
>         axis2_char_t *om_str = NULL;
>         om_str = AXIOM_NODE_TO_STRING(ret_node, env);
>         if (om_str)
>    printf("-->[%s]\n", om_str);
>         //printf("\necho client invoke SUCCESSFUL!\n");
>     }
>     else
>     {
>       AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Stub invoke 
> FAILED: Error code:"
>                   " %d :: %s", env->error->error_number,
>                         AXIS2_ERROR_GET_MESSAGE(env->error));
>         printf("echo client invoke FAILED!\n");
>     }
>     
>     if (svc_client)
>     {
>         AXIS2_SVC_CLIENT_FREE(svc_client, env);
>         svc_client = NULL;
>     }
>     if (endpoint_ref)
>     {
>         AXIS2_ENDPOINT_REF_FREE(endpoint_ref, env);
>         endpoint_ref = NULL;
>     }
>     return 0;
> }
> /* build SOAP request message content using OM */ 
> axiom_node_t * build_om_payload_for_echo_svc(const axis2_env_t *env) {
>     axiom_node_t *echo_om_node = NULL;
>     axiom_element_t* echo_om_ele = NULL;
>     axiom_node_t* text_om_node = NULL;
>     axiom_element_t * text_om_ele = NULL;
>     axiom_namespace_t *ns1 = NULL;
>     axis2_char_t *om_str = NULL;
>     
>     ns1 = axiom_namespace_create (env, 
> "http://ws.apache.org/axis2/c/samples";, "ns1");
>     echo_om_ele = axiom_element_create(env, NULL, 
> "echoString", ns1, &echo_om_node);
>     text_om_ele = axiom_element_create(env, echo_om_node, 
> "text", NULL, &text_om_node);
>     AXIOM_ELEMENT_SET_TEXT(text_om_ele, env, "echo5", text_om_node);
>     
>     om_str = AXIOM_NODE_TO_STRING(echo_om_node, env);
>     if (om_str)
>         printf("<--[%s]\n", om_str);
>     return echo_om_node;
> }
> ---------------------------------------------
>  
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to