Hi,
I have a problem of sharing a single service among two threads.I
encountered this problem when developing a sample WS-Eventing publisher
service. This service engages the Savan (WS-Eventing implementation) module.
This is the scenario.
A client sends a Subscribe request and the Savan in-handler captures
this request. It then creates a subscriber object and attaches that to a
hash map in the service.
axis2_svc_t *svc = NULL;
axis2_param_t *param = NULL;
axis2_hash_t *store = NULL;
savan_subscriber_t *subscriber = NULL;
svc = AXIS2_MSG_CTX_GET_SVC(msg_ctx, env);
param = AXIS2_SVC_GET_PARAM(svc, env, SUBSCRIBER_STORE);
store = (axis2_hash_t*)AXIS2_PARAM_GET_VALUE(param, env);
/* Extract info from incoming msg and create a subscriber */
subscriber = savan_sub_processor_get_subscriber_from_msg(env, msg_ctx);
/* Store the created subscriber in the svc */
axis2_hash_set(store, SAVAN_SUBSCRIBER_GET_ID(subscriber, env),
AXIS2_HASH_KEY_STRING, subscriber);
Then this service spawns a thread which would periodically publish some
test events. This is done in the invoke function of the service skeleton.
When spawning, I pass the current configuration context and the service
to this thread as follows.
publisher_data_t *data = AXIS2_MALLOC(env->allocator,
sizeof(publisher_data_t));
data->env = (axis2_env_t*)env;
data->svc = AXIS2_MSG_CTX_GET_SVC(msg_ctx, env);
data->conf_ctx = AXIS2_MSG_CTX_GET_CONF_CTX(msg_ctx, env);
axis2_thread_t *worker_thread =
AXIS2_THREAD_POOL_GET_THREAD(env->thread_pool,
publisher_worker_func, (void*)data);
if(NULL == worker_thread)
{
printf("failed to create thread");
return AXIS2_FAILURE;
}
AXIS2_THREAD_POOL_THREAD_DETACH(env->thread_pool, worker_thread);
Inside the thread, I use the passed in conf context and the service to
create a service client.
publisher_data_t *mydata = (publisher_data_t*)data;
main_env = mydata->env;
conf_ctx = mydata->conf_ctx;
svc = mydata->svc;
env = axis2_init_thread_env(main_env);
This is how the service client is created:
svc_client = axis2_svc_client_create_with_conf_ctx_and_svc(env, path,
conf_ctx, svc);
ret_node = AXIS2_SVC_CLIENT_SEND_RECEIVE(svc_client, env, test_node);
test_node is the dummy data that I want to publish.
The problem is that this call to SEND_RECEIVE fails at the following
code. (svc_client.c:1007)
op = AXIS2_SVC_GET_OP_WITH_QNAME(svc_client_impl->svc, env, op_qname);
if (!op)
{
/*TODO:error - svc does not have the operation*/
return NULL;
}
However, if I create the service client without using the conf context
and the service passed in to the thread, then the SEND_RECEIVE succeeds.
But then that service is a *separate* instance and therefore, it doesn't
have the hash map I created above.
svc_client = axis2_svc_client_create(env, path);
What is wrong here?
Thanks,
Ishan.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]