Ice programming with java
Download
1 / 21

Ice Programming with Java - PowerPoint PPT Presentation


  • 62 Views
  • Uploaded on

Ice Programming with Java. 6. Server-Side Java Mapping. Lesson Overview. This lesson presents: the mapping from Slice to Java relevant to the server side. the relevant APIs that are necessary to initialize and finalize the Ice run time

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Ice Programming with Java' - thanh


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
Ice programming with java

Ice Programming with Java

6. Server-SideJava Mapping


Lesson overview
Lesson Overview

  • This lesson presents:

    • the mapping from Slice to Java relevant to the server side.

    • the relevant APIs that are necessary to initialize and finalize the Ice run time

    • how to implement and register object implementations.

  • By the end of this lesson, you will be able to write a working Ice server.


Server side java mapping
Server-Side Java Mapping

All of the client-side Java mapping also applies to the server side.

Additional server-side functionality you must know about:

  • how to initialize and finalize the server-side run time

  • how to implement servants

  • how to pass parameters and throw exceptions

  • how to create servants and register them with the run time


Initializing the ice run time
Initializing the Ice Run Time

public class Server {

public static void

main(String[] args)

{

intstatus = 1;

Ice.Communicatoric = null;

try {

ic= Ice.Util.initialize(args);

// server code here...

status = 0;

} catch (Exception e) {

}

if (ic) {

try {

ic.destroy();

} catch (java.lang.Exception ex)

}

}

System.exit(status);

}

}


Server side initialization
Server-Side Initialization

Servers must create at least one object adapter, activate that adapter, and then wait for the Ice run time to shut down:

ic = Ice.Util.initialize(args);

Ice.ObjectAdapter adapter

= ic.createObjectAdapterWithEndpoints(

"MyAdapter", "tcp -p 10000");

// Instantiate and register one or more servants here...

adapter.activate();

ic.waitForShutdown();

An object adapter provides one or more endpoints at which the server listens for incoming requests. An adapter has a name that must be unique within its communicator.

Adapters must be activated before they start accepting requests.

You must call waitForShutdown from the main thread to wait for the server to shut down (or otherwise prevent the main thread from exiting).


Mapping for interfaces
Mapping for Interfaces

Interfaces map to skeleton classes with an abstract method for each Slice operation:

module M {

interface Simple {

void op();

};

};

This generates:

package M;

public interface _SimpleOperations

{

void op(Ice.Current current);

}

public interface Simple extends Ice.Object,

_SimpleOperations,

_SimpleOperationsNC;

public abstract class _SimpleDisp

extends Ice.ObjectImpl

implements Simple;


Mapping for interfaces 1
Mapping for Interfaces (1)

You must implement all abstract methods that are inherited from the skeleton class.

You can add whatever else you need to support your implementation:

  • constructors and finalizers

  • public or private methods

  • public or private data members

  • other base interfaces


Mapping for parameters
Mapping for Parameters

Server-side operation signatures are identical to the client-side operation signatures (except for a trailing parameter):

  • In-parameters are passed by value or by reference.

  • Out-parameters are passed by holder types.

  • Return values are passed by value or by reference.

  • Every operation has a single trailing parameter of type Ice.Current.

    string op(int a, string b, out float c, out string d);

    Maps to:

    String op(int a, String b,

    Ice.FloatHolderc, Ice.StringHolder d,

    Ice.Current__current);


Throwing exceptions
Throwing Exceptions

exception GenericError { string reason; };

interface Example {

void op() throws GenericError;

};

You could implement opas:

public void op(Ice.Current c) throws GenericError

{

throw new GenericError("something failed");

}

Do not throw Ice run-time exceptions. You can throw ObjectNotExistException, OperationNotExistException, or FacetNotExistException, which are returned to the client unchanged. But these have specific meaning and should not be used for anything else.

If you throw any other run-time exception, the client will get an UnknownLocalExceptionorUnknownException.


Tie classes
Tie Classes

Tie classes are an alternative mechanism for implementing servants.

The --tie option for slice2javagenerates tie classes in addition to the normal server-side code.

Tie classes replace inheritance with delegation. This way, your implementation class need not inherit from the skeleton class:

Use the tie mapping when your implementation class must inherit from some other application class (and therefore cannot be derived from the skeleton class).

_NodeDisp

«interface»

_NodeOperations

«interface»

Skeleton

Class

_NodeTie

NodeI

Tie

Class

Implementation

Class


Creating an objectadapter
Creating an ObjectAdapter

Each server must have at least one object adapter. You create an adapter with:

local interface ObjectAdapter;

local interface Communicator {

ObjectAdaptercreateObjectAdapter(string name);

ObjectAdaptercreateObjectAdapterWithEndpoints(

string name,

string endpoints);

// ...

};

The endpoints at which the adapter listens are taken from configuration (first version), or from the supplied argument (second version).

Example endpoint specification:

tcp -p 10000:udp -p 10000:ssl -p 10001Endpoints have the general form:

<protocol> [-h <host>] [-p <port>] [-t timeout] [-z]


Object adapter states
Object Adapter States

An object adapter is in one of three possible states:

  • Holding (initial state after creation)

    The adapter does not read incoming requests off the wire (for TCP and SSL) and throws incoming UDP requests away.

  • Active

    The adapter processes incoming requests. You can transition freely between the Holding and Active state.

  • Inactive

    This is the final state, entered when you initiate destruction of the adapter:

    • Requests in progress are allowed to complete.

    • New incoming requests are rejected with a ConnectionRefusedException.


Controlling adapter state
Controlling Adapter State

The following operations on the adapter relate to its state:

local interface ObjectAdapter {

void activate();

void hold();

void deactivate(); void waitForHold(); void waitForDeactivate(); void destroy();

// ...

};

The operations to change state are non-blocking.

If you want to know when a state transition is complete, call waitForHold or waitForDeactivate as appropriate.

destroy blocks until deactivation completes.

You can re-create an adapter with the same name once destroycompletes.


Object identity
Object Identity

Each Ice object has an associated object identity.

Object identity is defined as:

struct Identity {

string name;

string category;

};

  • The name member gives each Ice object a unique name.

  • The category member is primarily used in conjunction with default servants and servant locators. If you do not use these features, the category is usually left as the empty string.

    The identity must be unique within the object adapter: no two servants that incarnate an Ice object can have the same identity.

    The combination of name and category must be unique.

    An identity with an empty name denotes a null proxy.


Stringified object identity
Stringified Object Identity

Two helper functions on the communicator allow you to convert between identities and strings:

interface Communicator

{

Identity stringToIdentity(String ident);

String identityToString(Identity id);

// ...

}

Stringified identities have the form <category>/<name>, for example:

person/fred

If no slash is present, the string is used as the name, with the category assumed to be empty.

The object adapter has a getCommunicator method that returns the communicator. You use the communicator to convert between strings and object identities.


The active servant map asm
The Active Servant Map (ASM)

Each adapter maintains a map that maps object identities to servants:

  • Incoming requests carry the object identity of the Ice object that is the target.

  • The ASM allows the server-side run time to locate the correct servant for the request.

  • Object identities must be unique per ASM.


Activating servants
Activating Servants

To make a servant available to the Ice run time, you must activate it. This adds an identity–servant pair to the ASM:

local interface ObjectAdapter {

Object* add(Object servant, Identity id);

Object* addWithUUID(Object servant);

// ...

};

Both operations return the proxy for the servant, for example:

SimplePrxsp = SimplePrxHelper.uncheckedCast(

adapter.add(new SimpleI("hello"),

adapter.getCommunicator().

stringToIdentity("fred")));

As soon as a servant is added to the ASM, the run time will dispatch requests to it (assuming that the adapter is activated).

addWithUUID adds the servant to the ASM with a UUID as the name, and an empty category.


Creating proxies
Creating Proxies

You can create a proxy without activating a servant for the proxy:

interface ObjectAdapter {

// ...

Object* createProxy(Identity id);

};

The returned proxy contains the passed identity and the adapter’s endpoints.

Note that the return type is Object* so, typically, you need to downcast the proxy before you can use it.


The ice application class
The Ice.ApplicationClass

Ice.Application is a utility class that makes it easy to initialize and finalize the Ice run time.

public abstract class Application

{

public Application();

public final int main(String appName, String[] args);

public final int main(String appName, String[] args,

String configFile);

public final int main(String appName, String[] args,

InitializationDataid);

public abstract int run(String[] args);

public static Communicator communicator();

public static String appName();

// ...

}

You call Application.mainfrom the realmain, and implement the body of your client or server in therunmethod.


Shutdown hook
Shutdown Hook

Ice.Applicationprovides control of the JVM shutdown hook:

package Ice;

public enumSignalPolicy { HandleSignals, NoSignalHandling }public abstract class Application

{public Application();

public Application(SignalPolicysignalPolicy); // ...

synchronized public static void destroyOnInterrupt();

synchronized public static void shutdownOnInterrupt();

synchronized public static void defaultInterrupt();

synchronized public static boolean interrupted();

}

The default behavior on interrupt is to destroy the communicator, allowing all currently running operation invocations to complete first.


Compiling and running a server
Compiling and Running a Server

To compile a client, you must:

  • compile the Slice-generated source files(s)

  • compile your application code

    For Linux:

    $ mkdir classes

    $ javac -d classes -classpath \

    > classes:$ICEJ_HOME/lib/Ice.jar \

    > Server.java \

    > generated/Demo/*.java

    To compile and run the server, Ice.jar must be in your CLASSPATH.

    Note that these commands are the same as for the client side—you need not supply server-specific options or use a server-specific class file or library.


ad