Avatar billede dsj Nybegynder
10. december 2003 - 15:40 Der er 15 kommentarer og
3 løsninger

CORBA hvordan

Er der nogen der lige huhej kan vise mig hvordan man får server- og klient-siden af CORBA til at køre - ganske simpelt?
Avatar billede arne_v Ekspert
10. december 2003 - 15:49 #1
Først: har du læst det eksempel der er i Java SDK docs ?
Avatar billede soreno Praktikant
10. december 2003 - 15:53 #2
Her er et eksempel, der (sidst jeg prøvede) virkede i 1.4.2

------Interface.idl
module HelloApp
{
  interface Hello
  {
      string sayHello();
      oneway void shutdown();
  };
};

------HelloServer.java
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import org.omg.PortableServer.POA;

public class HelloServer
{
    public static void main(String args[])
    {
        try
        {
            // create and initialize the ORB
            ORB orb = ORB.init(args, null);

            // get reference to rootpoa & activate the POAManager
            POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
            rootpoa.the_POAManager().activate();

            // create servant and register it with the ORB
            HelloImpl helloImpl = new HelloImpl();
            helloImpl.setORB(orb);

            // get object reference from the servant
            org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl);
            Hello href = HelloHelper.narrow(ref);

            // get the root naming context
            // NameService invokes the name service
            org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");

            // Use NamingContextExt which is part of the Interoperable
            // Naming Service (INS) specification.
            NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

            // bind the Object Reference in Naming
            String name = "Hello";
            NameComponent path[] = ncRef.to_name(name);
            ncRef.rebind(path, href);

            System.out.println("HelloServer ready and waiting ...");

            // wait for invocations from clients
            orb.run();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        System.out.println("HelloServer Exiting ...");
    }
}

class HelloImpl extends HelloPOA
{
    private ORB orb;

    public void setORB(ORB orb_val)
    {
        orb = orb_val;
    }

    // implement sayHello() method
    public String sayHello()
    {
        return "\nHello world !!\n";
    }

    // implement shutdown() method
    public void shutdown()
    {
        orb.shutdown(false);
    }
}

------HelloClient.java
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;

public class HelloClient
{
    static Hello helloImpl;

    public static void main(String args[])
    {
        try
        {
            // create and initialize the ORB
            ORB orb = ORB.init(args, null);

            // get the root naming context
            org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");

            // Use NamingContextExt instead of NamingContext. This is
            // part of the Interoperable naming Service.
            NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

            // resolve the Object Reference in Naming
            String name = "Hello";
            helloImpl = HelloHelper.narrow(ncRef.resolve_str(name));

            System.out.println("Obtained a handle on server object: " + helloImpl);
            System.out.println(helloImpl.sayHello());
            helloImpl.shutdown();

        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

Compile med:
idlj -fall Interface.idl
Kompiler så alle .java filerne (og i subdirectory).

Kør med:
#1
  orbd -ORBInitialPort 1050

#2
  java HelloServer -ORBInitialPort 1050 -ORBInitialHost localhost

#3
  java HelloClient -ORBInitialPort 1050 -ORBInitialHost localhost
Avatar billede dsj Nybegynder
10. december 2003 - 15:54 #3
Jeg har kigget i tutorial'en, men fandt nogle temmelig lange forklaringer, det jeg er ude efter er mere enkelt, kode.
Avatar billede arne_v Ekspert
10. december 2003 - 16:09 #4
Jeg tvivler på at der eksisterer en meget simpel CORBA løsning.

Komponent teknologi er per natur kompleks. EJB og DCOM er jo heller
ikke kendt for at være simple.
Avatar billede soelvpil Nybegynder
10. december 2003 - 21:01 #5
Hold dig langt væk fra CORBA, med mindre du er tvunget til det, eller har stor lyst til at rykke dig i håret over sære fejlbeskeder.

Hvis både klient og server er i Java, bør du kigge på RMI i stedet, det er meget simplere.

Hvis klient og server er i forskellige sprog, ville jeg overveje at kigge på Webservices i stedet.
Avatar billede dsj Nybegynder
10. december 2003 - 21:42 #6
RMI har nogle ulemper, som jeg kan komme udenom - f.eks. kan man kun have ET RMI-register igang pr. JVM hvilket betyder, at jeg ikke kan have registre på flere porte, og den går bare ikke !
Avatar billede arne_v Ekspert
10. december 2003 - 21:58 #7
CORBA er ikke en RPC teknologi som RMI, .NET remoting og Web Services
(som de er idag).

CORBA er en distribueret komponent teknologi som DCE/DCOM og EJB.

Medmindre du skal bruge noget avanceret som f.ex. distribuerede
transaktioner, så er CORBA nok et overkill.
Avatar billede arne_v Ekspert
10. december 2003 - 22:04 #8
Umiddelbart har jeg svært ved at kun et registry per JVM som et stort problem,
men der er sikert gode grunde til det.

Men hvis du alligevel vil have forskellige directories, hvorfor så have
et directory ? Med nogen ganske almindelige sockets skal du selvfølgelig selv
stå for serialisering og deserialisering, men så svært er det heller ikke.
Og med sockets har du frit slag til at lave det som du vil.
Avatar billede dsj Nybegynder
10. december 2003 - 22:19 #9
Jeg har bare ikke tiden til at lave det manuelt, som RMI gør af sig selv, f.eks. mht. trådning. Mest af alt er det navne-servicen jeg benytter mig af, og som vil tage tid at lave...
Avatar billede arne_v Ekspert
10. december 2003 - 22:24 #10
Er Tomcat en mulighed ?

Fordi så kunne du prøve web services.

Du kan få genereret både stub og skeleton der også. Den håndterer
både trådning og serialisering/deserialisering.
Avatar billede arne_v Ekspert
10. december 2003 - 22:26 #11
Alternativt kunne du lave noget meget meget grimt og forsøge at køre
flere registries i samme JVM ved at lege lidt med classloaders.
Avatar billede dsj Nybegynder
10. december 2003 - 22:43 #12
Nu kender jeg absolut keines til web-services, men ved blot at Tomcat er en JSP-container (ikke?). Hvad går web-services ud på og hvordan distribuerer man objekter?
Avatar billede arne_v Ekspert
10. december 2003 - 22:57 #13
Tomcat er en JSP/Servlet container.

Den simple måde at bruge Axis på er:
  - man downloader og installerer Tomcat
  - man downloader og kopierer Axis web applikationen til Tomcat webapps directory
  - man tager omdøber sine services (svarer til ServerImpl.java i RMI)
    Serv1.java,...,ServX.java til Serv1.jws,...,ServX.jws og
    kopierer dem til Axis directoriet i Tomcat
  - Axis generer så Skeleton kode første gang de kaldes
  - så kører du wsdl2java og får genereret stub kode
  - så skriver du client koden og distrubuerer client+stub kode

Meget ligesom RMI.

Ingen problemer med firewalls da det er HTTP.
Avatar billede arne_v Ekspert
10. december 2003 - 23:01 #14
Bemærk at det en den simple måde at bruge Axis på.

Den kan være en PITA hvis man skal lave noget mere avanceret.
Avatar billede dsj Nybegynder
11. december 2003 - 00:15 #15
Jeg synes PITA er kedeligt, vil hellere have en KEBAB...
Avatar billede dsj Nybegynder
14. december 2003 - 16:47 #16
Dem der vil have point må lægge et svar...
Avatar billede soreno Praktikant
14. december 2003 - 16:58 #17
.
Avatar billede arne_v Ekspert
14. december 2003 - 17:00 #18
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester