Ok,
If you look at the very first example in the users guide:
1 import org.apache.axis.client.Call;
2 import org.apache.axis.client.Service;
3 import javax.xml.namespace.QName;
4
5 public class TestClient {
6 public static void main(String [] args) {
7 try {
8 String endpoint =
9 "http://ws.apache.org:5049/axis/services/echo";
10
11 Service service = new Service();
12 Call call = (Call) service.createCall();
13
14 call.setTargetEndpointAddress( new java.net.URL(endpoint) );
15 call.setOperationName(new QName("http://soapinterop.org/",
echoString"));
16
17 String ret = (String) call.invoke( new Object[] { "Hello!" } );
18
19 System.out.println("Sent 'Hello!', got '" + ret + "'");
20 } catch (Exception e) {
21 System.err.println(e.toString());
22 }
23 }
24 }
You can see that the service endpoint is a URL declared at lines 8-9.
You simply have to build this URL using the host you have read from your
configuration file.
If you are working with generated stubs, you will find that your Service
class has at least two get<PortName>() methods (more if you use a
WS-Addressing aware generator).
One of these methods gets a URL instance as a parameter. This URL must
contain the endpoint URL, that is, the same URL you would use in the
example above. Therefore, you can again build this URL using your
configured host name.
You may allow configuring only a part of your endpoints, like in:
String hostName = myProps.getProperty("hostName");
URL url = new URL("http://" + hostName + "/axis/services/echo");
or you may get the full endpoint URL from your configuration file, like:
String echoEndpoint = myProps.getProperty("Endpoint.Echo");
URL url = new URL(echoEndpoint);
I personally think the second option gives you more freedom to change
your server deployment at will.
HTH,
Rodrigo
Carsten Schmidt wrote:
Hi Rodrigo,
these ideas are very interesting.
First of all, thanks a lot for that.
But for the first way of making the host address configurable, I still
have to ask you, how to do that in detail?
I don't mean how to read the address from a properties file, but how can
I set the value?
Carsten
Am Montag, den 15.05.2006, 17:28 +0200 schrieb Rodrigo Ruiz:
Carsten,
In fact, there are several ways to handle your situation, but I
guess
almost none of them is as simple as adding some lines to your client
code. The ones I know are:
- Make the host address configurable. That is, read the host address
from a configuration file. I know this is not what you are asking
for,
but it is probably the only easy workaround to your problem. In fact,
I
think it will be the only one that will work if you want to test
your
client application from the same host, and manually select the
adapter
to use.
- You may use DNS to provide a common name to your server, and access
it
through host name, instead of host address. This probably means some
work to get your client domain name, in order to build the complete
host
name in each subnetwork, or be sure that using the host name without
a
domain name will return you the correct host address in all cases.
- In a more complicated fashion, you could decide to convert your
service in a "standard" service, and register it into your DNS
servers.
DNS protocol allows to register the addresses for "standard"
services,
providing a simplistic discovery service, and allowing you to ask for
a
service name, instead of a host name. AFAIK, this option is not
usual,
but it should work. I am not sure, but you may probably need to use
Jakarta commons-net library to perform such kind of queries to your
DNS
server.
- You can delegate the problem to a well-known UDDI server. Anyway,
if
you use TCP/IP, this will just move your problem from one host to
another, as this UDDI server/s will probably also have different
addresses in each sub-network.
- You might use some UDP based discovery service. The idea in this
case
would be to send a broadcast message, and receive the appropriate
address from some arbitrary point on your network. If you implement
such
a service in your own server, you will probably be able to get the
host
address from the response message meta-data itself. There are some
standard libraries for achieving this out there, or you could try to
implement your own, as it is plenty of examples on Google ;-)
Hope this helps,
Rodrigo
Carsten Schmidt wrote:
Hi Alain,
thanks for your answer, but it seems as if the
NetworkInterface-class
would just be able to give you information about the interfaces.
For me, it is important to tell the program which Interface to use,
because the webserver I'm working on got different IP's in
different
sub-networks.
So, I am looking for a method like setHostAdress(foo). Maybe this
is
more a part of java than axis, but the Axis-Call-class seems to
handle
the whole hardware/network-stuff on it's own.
I can't believe that there is no smart way to handle this.
Carsten
Am Montag, den 15.05.2006, 16:28 +0200 schrieb Pannetier Alain:
Hi Carsten,
Here is an example I use to know whether I'm in the office or at
home :
try {
Enumeration myInterfaces =
NetworkInterface.getNetworkInterfaces();
interfaceEnum:
while ( myInterfaces.hasMoreElements()) {
NetworkInterface netInterf = (NetworkInterface)
myInterfaces.nextElement();
Enumeration addresses = netInterf.getInetAddresses() ;
while (addresses.hasMoreElements()) {
InetAddress address = (InetAddress)
addresses.nextElement();
if
( address.getHostAddress().startsWith( OFFICE_PREFIX ) ) {
isAtTheOffice = true ;
break interfaceEnum ;
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
...
It shows how to loop on all your interfaces and select one
(according
to its address prefix...).
That's probably close to what your're after.
Alain
-----Original Message-----
From: Schmidt, Carsten -81.01-
[mailto:[EMAIL PROTECTED]
Sent: 15 May 2006 16:17
To: [email protected]
Subject: RE: Select the output-network-interface to call an
axis-webservice
Hi,
did really no one every had a problem like that?
This problem can not be so special, can it?
But maybe you know another mailinglist or a book, which might be
able
to help me?
It is really important for me to find a solution for that, and
meanwhile I ain't got no more idea where to look at.
Regards,
Carsten
Hi everybody,
maybe this question has already been answered a thousend times,
but
I
haven't found anything about it.
I got a server with a few different network adapters. Each of
them
with
a different IP. Now I'm searching for a way to call a webservice
by
choosing exacly one of those adapters (which is not the default
one).
How can I do than?
java.net.NetworkInterface shows me what is available, but where
can
it
set what to use? org.apache.axis.client.Call?
org.apache.axis.client.Service?
Can anybody help me?
Carsten
--
-------------------------------------------------------------------
GRIDSYSTEMS Rodrigo Ruiz Aguayo
Parc Bit - Son Espanyol
07120 Palma de Mallorca mailto:[EMAIL PROTECTED]
Baleares - España Tel:+34-971435085 Fax:+34-971435082
http://www.gridsystems.com
-------------------------------------------------------------------
--
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.1.392 / Virus Database: 268.5.6/339 - Release Date:
14/05/2006
--
-------------------------------------------------------------------
GRIDSYSTEMS Rodrigo Ruiz Aguayo
Parc Bit - Son Espanyol
07120 Palma de Mallorca mailto:[EMAIL PROTECTED]
Baleares - España Tel:+34-971435085 Fax:+34-971435082
http://www.gridsystems.com
-------------------------------------------------------------------
--
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.1.392 / Virus Database: 268.5.6/339 - Release Date: 14/05/2006