We use a thin jws wrapper to our services, we place the .jws file in
/webapps/axis/ and then can we can access it directly with
http://myserver.com:8080/axis/mydynwebservice.jws or get the wsdl with
?wsdl appended to it.

The downside to this is the discovery of what web services are there, we
know what we put there so that isn't a problem but it isn't a deployed
web service that the axis admin can see.

Michael Oliver
CTO
Alarius Systems LLC
3325 N. Nellis Blvd, #1
Las Vegas, NV 89115
Phone:(702)643-7425
Fax:(520)844-1036
*Note new email changed from [EMAIL PROTECTED]

-----Original Message-----
From: Simplica Information [mailto:[EMAIL PROTECTED] 
Sent: Thursday, January 13, 2005 7:13 AM
To: [EMAIL PROTECTED]
Subject: Adding Services Dynamically

Hello,

I am new to Axis and am hoping to get some advice on how to dynamically
add
services on the server. 

Here is our situation:

1. We are building a web services front-end to a proprietary scripting
system where the definitions of various functions (400+) are stored in
database tables
2. The database tables specify the name of the function, the number and
data
type of the arguments, the type of the return value, etc.
3. The function definitions are in the database because they are updated
from time-to-time
4. We want each of these functions to be published as an Axis web
service
5. In addition to these dynamic services, we have a couple of static
services that won't change

Here is what we have tried so far:

1. We defined the static services the normal way
2. We created our own EngineConfigurationFactory that essentially wraps
the
FileProvider that the EngineConfigurationFactoryServlet provides
3. During the call to EngineConfiguration.configureEngine() in the
wrapper
class we get the existing Deployment (that has our already defined
static
services) and just try to add our dynamic services there. Here is our
test
code:

  public void configureEngine(AxisEngine axisEngine) throws
ConfigurationException {
    ...
    fileProvider.configureEngine(axisEngine);
    WSDDDeployment deployment = fileProvider.getDeployment();
    ...
    for(int i=0; i<functionNames.length; i++) {
      WSDDService service = new WSDDService();
      service.setParameter("allowedMethods", "invoke");
      service.setParameter("className",
"com.myproject.service.ScriptFunction");
      service.setProviderQName(new QName("java:RPC"));
      service.setQName(new QName("urn:" + functionNames[i]));
      deployment.deployService(service);
    }
    fileProvider.writeEngineConfig(axisEngine);
  }

4. Unfortunately, this does not really work. I can see the service
entries
in server-config.wsdd, but the server complains when I try to invoke one
of
them. That is, the client gets back 'The AXIS engine could not find a
target
service to invoke! targetService is null'.  

5. The odd thing is, if I restart the server with the code above
commented
out, it reads the server-config.wsdd entry and the service is there OK.
So,
not only does this code prevent services from being available, it also
seems
to break an otherwise properly deployed service.

Here are my questions:

1. What are we doing wrong? Is there an easier/better way to accomplish
this?
2. Even if this approach did work, we still have another problem. How to
programmatically specify the details (function name, argument types,
etc.)
without a Java class?  Obviously the generic class
com.myproject.service.ScriptFunction in our test code would make every
function look the same except for the name.

I realize this may be somewhat of an advanced issue, but I am hoping
someone
has experience with something like it or can point me to some
documentation
or examples.

Thanks in advance for any help.

Marc



Reply via email to