On 6/24/06, Ryzhov, Evgeny <[EMAIL PROTECTED]> wrote:
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?

Evgeny,

You can reuse options and svc_client objects across multiple requests.
Just free, svc_client after making all the invocations. I do this with
PHP Axis2 extension.

once the options is set to svc_client, svc_client owns the structure,
meaning options is not allowed to be modified after setting. But you
can still get the options object and vary the options for different
invocation. Make sure you do correct type casting to avoid any
warning.

-Nabeel

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