hello users,

i have taken the modified sample to test it with the
normal echo-service in my enviroment :

winXP
vs2005cpp
axis2_c (svn 28.06.07) build with
ENABLE_LIBCURL = 1
LIBCURL_BIN_DIR = mypath\libcurl-7.15.1-msvc-win32-ssl-0.9.8a-zlib-1.2.3

when i start more then one thread, i have different kinds of errors
and the program crashes.

i am not sure, if i have done something wrong with the parameters
of the studio ...

C/C++ :
/Od /I "X:\ws\axis2_c\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc80.pdb" /W3 /nologo /c /Wp64 /ZI /TP /errorReport:prompt

Linker :
/OUT:"X:\_tmp_axis\multi_echo_client\Debug\multi_echo_client.exe" /INCREMENTAL /NOLOGO /LIBPATH:"X:\ws\axis2_c\lib" /MANIFEST /MANIFESTFILE:"Debug\multi_echo_client.exe.intermediate.manifest" /DEBUG /PDB:"x:\_tmp_axis\multi_echo_client\debug\multi_echo_client.pdb" /SUBSYSTEM:CONSOLE /MACHINE:X86 /ERRORREPORT:PROMPT axiom.lib axis2_engine.lib axis2_parser.lib axutil.lib kernel32.lib

... or if there is an issue around libcurl.dll. one of the errors that
occurs is, that the program breaks at axis2_libcurl.c in line 305
"curl_easy_perform (handler);"

at the moment this is not critical for me, i just want to give my
feedback in "testing client multithreading on Windows"

thx derMark



Samisa Abeysinghe schrieb:
This attached file works with the echo service sample of Axis2/C, that shows that the threading works fine.

It must have been the way you created the env that caused the problems.

I tested this and works fine, tanks Manjula for the comprehensive working sample.

Samisa...

manjula wrote:
Hi Stefano,
I have successfully compiled and run the sample code you have sent with
40 threads, after doing some minor changes to your code. I have attached
the modified source code. There are no issues with threading. Following
are the changes I had done.

1. Escape the '\' charactor in AXIS2_PATH constant.
2. change the XML_REQUEST and SOAP_ACTION as in the attached file

The change 2 is done just because my services expect that soap action
and payload.

Please let us know if you have any further problems.

Thanks

-Manjula.


On Mon, 2007-07-09 at 17:56 +0200, Stefano Pettini wrote:
Hi all,

Again multithreading. That's my last effort to solve the problem, then I give up. Please have a look to the attached file, that can be compiled and run using VS6 on Windows. The file is easy to understand and can be run just tuning the #defines at the beginning.

May you help me testing client multithreading on Windows?

Thanks.

Stefano

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

#define N_THREADS 40
#define N_CLIENTS 1
#define N_CALLS 1
#define SOAP_ENDPOINT "http://localhost:9090/axis2/services/echo";
#define SOAP_ACTION "echoString"
#define XML_REQUEST "<echoString><text>Hello</text></echoString>"
#define AXIS2_PATH "D:\\manjula\\axis2\\build\\deploy"

#include <iostream>

#include <axiom.h>
#include <axiom_soap.h>
#include <axiom_xml_reader.h>
#include <axiom_xml_writer.h>

#include <axutil_allocator.h>
#include <axutil_error.h>
#include <axutil_error_default.h>
#include <axutil_log.h>
#include <axutil_log_default.h>

#include <axis2_util.h>
#include <axis2_client.h>

using namespace std;

DWORD WINAPI threadProc(LPVOID pParam)
{
    const int N = N_CLIENTS; // Number of clients per thread
    const int M = N_CALLS; // Calls per client
    const int id = (int) pParam;
int i;
    int j;
axutil_error_t* error;
    axutil_allocator_t* alloc;
    axutil_log_t* log;

    axutil_env_t *env = NULL;
axis2_endpoint_ref_t* endpoint[N]; axis2_options_t* options[N];

    axis2_svc_client_t* svc_client[N];
axiom_node_t* out_node = NULL;
    axiom_node_t* in_node = NULL;

    axiom_namespace_t* ns = NULL;

    // Environment
    /*alloc = axutil_allocator_init(NULL);
    error = axutil_error_create(alloc);
    log = axutil_log_create_default(alloc);
env = axutil_env_create_with_error_log(alloc, error, log);*/
    env = axutil_env_create_all("test.log", AXIS2_LOG_LEVEL_DEBUG);
// Source document
    string xml = XML_REQUEST;
axiom_xml_reader_t* reader = axiom_xml_reader_create_for_memory(env, (void*) xml.c_str(), xml.length(), AXIS2_DEFAULT_CHAR_SET_ENCODING, AXIS2_XML_PARSER_TYPE_BUFFER); axiom_stax_builder_t* builder = axiom_stax_builder_create(env, reader); axiom_document_t* document = axiom_stax_builder_get_document(builder, env);

    in_node = axiom_document_get_root_element(document, env);

    if (!in_node)
    {
        cout << AXIS2_ERROR_GET_MESSAGE(env->error) << endl;
        return -1;
    }

    // Options
    for (i=0; i<N; i++)
    {
        options[i] = axis2_options_create(env);
        endpoint[i] = axis2_endpoint_ref_create(env, SOAP_ENDPOINT);

        axis2_options_set_to(options[i], env, endpoint[i]);
//axis2_options_set_soap_version(options[i], env, AXIOM_SOAP_12); axis2_options_set_soap_action(options[i], env, axutil_string_create(env, SOAP_ACTION)); axis2_options_set_xml_parser_reset(options[i], env, AXIS2_FALSE);
    }
// Clients
    for (i=0; i<N; i++)
    {
        svc_client[i] = axis2_svc_client_create(env, AXIS2_PATH);
//svc_client[i] = axis2_svc_client_create(env, AXIS2_GETENV("AXIS2C_HOME")); if (!svc_client[i])
        {
            cout << "counld not create svc client\n";
            return -2;
        }

        axis2_svc_client_set_options(svc_client[i], env, options[i]);
    }
// SOAP call
    for (j=0; j<M; j++)
        for (i=0; i<N; i++)
        {
out_node = axis2_svc_client_send_receive(svc_client[i], env, in_node);

            if (out_node)
            {
if (axis2_svc_client_get_last_response_has_fault(svc_client[i], env))
                {
                    axiom_soap_envelope_t* envelope;
                    axiom_soap_body_t* body;
                    axiom_soap_fault_t* fault;

                    axiom_soap_fault_code_t* code;
                    axiom_soap_fault_reason_t* reason;

envelope = axis2_svc_client_get_last_response_soap_envelope(svc_client[i], env);
                    body = axiom_soap_envelope_get_body(envelope, env);
                    fault = axiom_soap_body_get_fault(body, env);

                    code = axiom_soap_fault_get_code(fault, env);
                    reason = axiom_soap_fault_get_reason(fault, env);

                    cout << "Returned SOAP error:" << endl;
if (code)
                    {
axiom_node_t* node = axiom_soap_fault_code_get_base_node(code, env); axiom_element_t* element = (axiom_element_t*) axiom_node_get_data_element(node, env); cout << "SOAP fault code: " << axiom_element_get_text(element, env, node) << endl;
                    }
if (reason)
                    {
axiom_node_t* node = axiom_soap_fault_reason_get_base_node(reason, env); axiom_element_t* element = (axiom_element_t*) axiom_node_get_data_element(node, env); cout << "SOAP fault reason: " << axiom_element_get_text(element, env, node) << endl;
                    }

                    return -3;
                }
                else
                {
                    cout << "OK! Response:" << endl << endl;

axiom_xml_writer_t* writer = axiom_xml_writer_create_for_memory(env, AXIS2_DEFAULT_CHAR_SET_ENCODING, AXIS2_FALSE, 0, AXIS2_XML_PARSER_TYPE_BUFFER); axiom_output_t* output = axiom_output_create(env, writer);

axiom_document_t* document = axiom_document_create(env, out_node, NULL);
                    axiom_document_serialize(document, env, output);
string xml = (axis2_char_t*) axiom_xml_writer_get_xml(writer, env); cout << xml.c_str() << endl;
                }
            }
            else
            {
                cout << "Returned AXIS2/NETWORK error" << endl;
                cout << AXIS2_ERROR_GET_MESSAGE(env->error) << endl;
                return -4;
            }
        }

    for (i = 0; i<N; i++)
        axis2_svc_client_free(svc_client[i], env);
axutil_env_free(env);

    Sleep(10000);
    cout << "Thread ID " << id << " completed" << endl;
return 0;
}

void main()
{
    axiom_xml_reader_init();

    for (int i = 0; i < N_THREADS; i++)
    {
        cout << "Creating thread " << i << endl << flush;
        CreateThread(NULL, 0, &threadProc, (void*) i, 0, NULL);
    }

    while (true)
        Sleep(10000);
}


------------------------------------------------------------------------

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