|
This is a document that attempts to answer many of the questions you may have about using JavaTM IDL technology. We will continue to update this document with your questions as we receive them. If you do not find your question answered here, please check the user-supported forum for Java IDL technology, which is available at http://forum.java.sun.com. For comments on the tutorials or other documents on this Web site, please send us email at corba-tutorial@sun.com.
Compatibility/Interoperability
The most common reason for this error when running HelloServer (and also HelloClient) from the Java IDL tutorial is that HelloServer is not in the classpath. For more information on setting the classpath variable, see Setting the classpath.The second most common reason occurs when a space is added between quotation marks in the following line of code:
NameComponent nc = new NameComponent("Hello", "");There should be no spaces between the quotation marks. Without spaces, this value is passed as a null. With a space between the quotations, a space character is passed.
The idlj compiler now generates server-side mappings based on the POA Inheritance Model. For compatibility with existing applications, a new flag has been added to the idlj compiler to allow it to generate server-side mappings based on the ImplBase Inheritance Model, -oldImplBase. Existing applications that need to talk to servers created in J2SE 1.3 or prior may need to update their MAKEFILE so that this flag is used, however, new applications that have no such requirements should not generate these deprecated mappings.
Other information on compatibility between J2SE 1.3 and J2SE 1.4 can be found in the compatibility document at http://java.sun.com/j2se/1 .4/compatibility-CORBA.html.
On Red Hat Linux installations InetAddress.getLocalHost() may return an InetAddress corresponding to the loopback address (127.0.0.1). This arises because the default installation creates an association in /etc/hosts between the hostname of the machine and the loopback address. To ensure that InetAddress.getLocalHost() returns the actual host address, update the /etc/hosts file or the name service configuration file (/etc/nsswitch.conf) to query dns or nis before searching hosts.
The most recent versions of the standard (OMG) minor code exceptions can be found at http://www.omg.org/docs/omg/03-01-04.txt.Some of the most common Sun minor code exceptions are the following:
- COMM_FAILURE/201. vmcid: SUN minor code: 201 literally means "CONNECT_FAILURE". This may be caused by a
java.net.SocketException
, usually one ofBindException
,ConnectException
, orNoRouteToHostException
.Some things to verify are:
- Is a naming service running? If not, start the ORBD naming service as described in the document Starting and Stopping ORBD.
- Are the
-ORBInitialHost
and-ORBInitialPort
values being set correctly for the naming service? If you are uncertain about what the settings should be, read the document Starting and Stopping ORBD.- Are the client and server applications aware of the port number (and machine name, if applicable) where the Naming Service is running? Read Starting and Stopping ORBD for more information on how to do this.
- COMM_FAILURE/208. vmcid: SUN minor code: 208 literally means "CONNECTION ABORT", which generally means the connection has been dropped.
- COMM_FAILURE/209. vmcid: SUN minor code: 209 literally means "CREATE_LISTENER_FAILED":
Unable to create the listener thread on the specific port. Either the post is taken or there was an error creating the daemon thread
. This generally indicates that the port on which you are trying to run the naming service is in use by another process. If you are running on Solaris, you could discover whether or not something is running on this port using the following terminal prompt command:
netstat | grep port_number
- OBJECT_NOT_EXIST/204. vmcid: SUN minor code: 204 literally means "SERVANT_NOT_FOUND". It is only thrown in one place:
corba.INSSubcontract.getINSReference
.
- MARSHAL/217. vmcid: SUN minor code: 217 means that your client tried to send either a
wchar
orwstring
in GIOP 1.0, which is not legal in the spec.
- MARSHAL/202. vmcid: SUN minor code: 202 means that the code is attempting to marshal an object that derives from
org.omg.CORBA.Object
, but that particular instance has never been connected to an ORB. When using the POA, you need to register the object with the POA first. If you need more information on how to register an object with the POA, refer to the POA document or the tutorial.
- BAD_PARAM/201. vmcid: SUN minor code: 201 literally means "NULL_PARAM". This exception often occurs because a Java
null
was given to awrite
method such aswrite_string
,write_octet_array
, etc. You cannot return a Javanull
as the result of a Java method.
- org.omg.CORBA.INTERNAL. vmcid: SUN minor code: 208 means
Unable to determine local hostname using InetAddress.getLocalHost().getHostName()
.The ORB uses
InetAddress.getLocalHost().getHostName()
to create a reference to the name service for looking for and/or binding references. It also usesInetAddress.getLocalHost().getHostName()
on the server side to create remote object references (i.e., IORs) that contain the name/port of the server (rather than a dotted-decimal/port pair).To avoid the call to
getHostName
, you can set the following properties (refer to Starting and Stopping ORBD if you are not sure how to do this):
- Set
com.sun.CORBA.ORBServerHost
to the DNS name or dotted-decimal address of the server if the ORB is acting as a server.- Set
com.sun.CORBA.ORBInitialHost
to the DNS name or dotted-decimal address of the name server.NOTE: These properties are proprietary and are subject to deletion or change.
If none of these suggestions work for you, or if you encounter a different Sun minor code exception, email us for more information at corba-tutorial@sun.com. When requesting the meaning of a minor code please include the following information:
- The platform on which the client and server are running (e.g., Solaris, Linux, Win32)
- The version of the JDK you are using (e.g., 1.4.0_01)
- A complete stack trace
- If you are using a naming service or an ORB from another vendor, please provide that information
The Java CORBA ORB shipped in J2SE is multi-threaded. On the server side, we have a thread pool such that each incoming request is handled by a separate thread. If all the pool's threads are in use when a new request comes in, a new thread is created and added to the pool. The thread is returned to the pool after the request is finished.
The Java CORBA ORB is threaded to allow scalability and concurrent request processing. The SINGLE_THREAD option for the POA threading policy is not supported.
The threading model for the Java CORBA ORB is implicit: the user does not set the thread policy for the ORB. There are no external, user-level APIs exposed for controlling the threading model or the number of threads.
No, it does not. If you need one of these services, you can implement one, you can purchase one off the shelf, or you can search for one freely available to start things off with. You can plug-in 3rd party services such as these to the J2SE v.1.4 ORB using INS technology.
You need to use the -ORBInitialHost <Host Name where Name Service is Launched> option when starting the client and/or server (whichever is not running on the same machine as the name server). This way the client and server know where to find the Name Service. An example can be found on the Web at http://java.sun.com/j2se/1.4/docs/guide/idl/tutorial/jidl2machines.html.
For compliance information for CORBA technology shipped with J2SE v.1.4, read the CORBA compliance statement at http://java.sun.com/j2se/1 .4/docs/api/org/omg/CORBA/doc-files/compliance.html.
To use an ORB other than the Java CORBA ORB in your application, you can set the org.omg.CORBA.ORBClass property to the ORB of your choice. For example, use code as shown in the example to explicitly set the ORB to the ORB-implementation you would prefer to use:
public class MyApp { public static void main( String args[] ) { Properties properties = System.getProperties(); properties.put( "org.omg.CORBA.ORBClass", "" ); try { ORB orb = ORB.init( args, properties); ...Check the vendor's documentation for information on setting properties specific to their ORB implementation.
Our J2SE v.1.4 ORB has been tested as part of the J2EE certification process, however, it has not been tested with all vendor's standalone CORBA ORBs.
If INS is supported in the other vendor's service, then, try this. Convert the Interoperable Object References (see IOR discussion in INS tutorial) on the other vendor's ORB server to a string using the ORB.object_to_string() method using INS. Write that string to a file.
A developer guide that includes an example application with a C++ client and an Enterprise JavaBeans component can be found on the Web site at: http://java.sun.com/j2se/1.4/docs/guide/rmi-iiop/interop.pdf.
The recommended way is to use the Interoperable Naming Service (INS), if this option is supported by the 3rd-party Naming Service.To use the Sun ORB with another vendor's Naming Service,
- Start the 3rd-party name server on Host
and Port.
- Pass the following argument to ORB.init():
-ORBInitRef NameService=corbaloc:iiop:1.2@:/NameServiceWhen you do orb.resolve_initial_references( "NameService" ), you should be able to connect to 3rd-party Name Service. If you are still not able to connect, try these troubleshooting hints:
- Verify that the 3rd-party Name Service supports INS.
- Verify that the host and port information is accurate.
- Verify that the 3rd-party Name Service has been started successfully.
- Verify that the 3rd-party Name Service supports GIOP 1.2. If not, refer to the Name Server's documentation for the correct the GIOP version, and modify the corbaloc: URL accordingly.
- Determine if the 3rd-party Name Service has a different object key it uses to contact NameService. If so, refer to the Name Server's documentation.
The Java IDL ORB is an ORB completely written using Java technology. The idlj compiler generates code that follows the conventions defined in the IDL to Java Language Mapping Specification. The Java ORB does not provide a compiler that generates code in any languages other than the Java platform. If you want to test interoperability between the Java ORB and an ORB written in another language (such as C++), you will need to find an ORB written in that language and a compiler that conforms to the specific language mapping. Language mapping specifications are available from the Object Management Group Web site at http://www.omg.org/technology/documents/formal/corba_language_mapping_specs.htm. A user who wants to use the Java platform on one side and C++ on the other will only share the IDL. You will have to use your C++ ORB's tools to generate the stubs and skeletons for use with the C++ ORB, but you don't have to change the IDL at all. To find a vendor that provides a CORBA ORB and a language mapping compiler in the language you are working with, search the Web for "C++ CORBA ORB", or equivalent.A developer guide that includes an example application with a C++ client and an Enterprise JavaBeans component can be found on the Web site at: http://java.sun.com/j2se/1.4/docs/guide/rmi-iiop/interop.html.
Although it is true that ORBs written in different languages should be able to talk to each other, we haven't tested the interoperability of the Java ORB with other vendor's ORBs.
We highly recommend that you use the latest version of the IDL-to-Java compiler, idlj for all new code. If you still need to use idltojava for legacy applications, you can download the idltojava compiler for JDK 1.2 from http://developer.java.sun.com/developer/earlyAccess/jdk12/idltojava.html.To get the latest version of the IDL-to-Java compiler, download the latest version of JavaTM 2 Platform, Standard Edition (J2SETM). When J2SE is installed, idlj will be located in the bin directory.
Other troubleshooting information related to idltojava is located in the Java IDL FAQ for J2SE v.1.3.
CORBA technology as part of the Java 2 platform consists of an Object Request Broker (ORB) written in the Java language (with a small bit of native code), the RMI programming model, and the IDL programming model.
The "magic" that gives us the cross-language, cross-vendor interoperability is the Internet InterORB Protocol, or IIOP. IIOP can be a transport protocol for distributed applications written in either IDL or Java RMI. IIOP allows distributed objects to conform to OMG's CORBA specification.
When using the IDL programming model, the interface is everything! It defines the points of entry that can be called from a remote process, such as the types of arguments the called procedure will accept, or the value/output parameter of information returned. Using IDL, the programmer can make the entry points and datatypes that pass between communicating processes act like a standard language.
CORBA is a language-neutral system in which the argument values or return values are limited to what can be represented in the involved implementation languages. In CORBA, object orientation is limited only to objects that can be passed by reference (the object code itself cannot be passed from machine-to-machine) or are predefined in the overall framework. Passed and returned types must be those declared in the interface.
With RMI, the IDL and the implementation language are the same thing, so you don't have to worry about mapping from one to the other. Language-level objects (the code itself) can be passed from one process to the next. Values can be returned by their actual type, not the declared type. Or, you can compile the interfaces to generate IIOP-compliant stubs and skeletons to talk to objects written on other machines in other CORBA-compliant languages.
This is a fundamental question and it's important to understand the distinction between these two ways of integrating the Java programming language with CORBA.
Java IDL is for CORBA programmers who want to program in the Java programming language based on interfaces defined in CORBA Interface Definition Language (IDL). This is "business as usual" CORBA programming, supporting the Java language in exactly the same way as other languages like C++ or COBOL.
Java RMI-IIOP (Remote Method Invocation over Internet Inter-ORB Protocol) is for developers who want to use the Java programming language to program to the Java RMI interfaces, but use IIOP as the underlying transport. Java RMI-IIOP provides interoperability with other CORBA objects implemented in various languages - but only if all the remote interfaces are originally defined as Java RMI interfaces. It is of particular interest to programmers using Enterprise JavaBeans (EJB), since the remote object model for EJB's is RMI-based.
There are several scenarios that will define how you will want to create distributed CORBA applications. Here are some of them:
Java IDL - If you have been developing CORBA applications using IDL for some time, you will probably want to stay in this environment. Create the interfaces using IDL, and define the client and server applications using the Java programming language to take advantage of its "Write Once, Run AnywhereTM" portability, its highly productive implementation environment, and its very robust platform.
RMI-JRMP - If all of your applications are written in the Java programming language, you will probably want to use Java RMI technology to enable communication between Java objects on different virtual machines and different physical machines. Using Java RMI without its IIOP option leverages its strengths of code portability, security, and garbage collection.
Java RMI-IIOP - If you are writing most of your new applications using the Java programming language, but need to maintain legacy applications written in other programming languages as well, you will probably want to use Java RMI with its IIOP compiler option.
For more information on product limitations, read Limitations.
The most recent versions of standard tag allocation files can be found at http://www.omg.org/cgi-bin/doc?standard-tags.
Copyright © 2000-2002 Sun Microsystems, Inc. All Rights Reserved. |
Java Software |