nn 1 | Page 16

SEC. 9.1 CORBA 509 object adapter.
Client application
Client proxy
Invocation request
Request-level interceptor
Message-level interceptor
Client ORB
Local OS To server
Figure 9-10. Logical placement of interceptors in CORBA.
In contrast, message-level interceptors are placed between an ORB and the underlying network. A message-level interceptor knows nothing about the message that is to be sent; it only has GIOP messages at its disposal that it may wish to modify. A typical example of a message-level interceptor is one that implements fragmentation at the sending side, and reassembly of the original GIOP message at the receiver side, for example, using the special Fragment messages.
Interceptors are seen only by an ORB, that is, it is the ORB’ s responsibility to invoke an interceptor. Clients and servers hardly ever see interceptors, except at the time a client binds to a server. Note that an ORB may make use of both types of interceptors at the same time. An overview of the use of interceptors in CORBA can be found in( Narasimhan et al., 1999), whereas the exact specifications are given in( OMG, 2001b).
Although the idea of an interceptor seems attractive at first sight, it can also be argued that it is a mechanism for breaking into an implementation to fix things that are apparently missing. For example, if CORBA had provided mechanisms to support developing and using object-specific proxies, there would be less need for interceptors. However, what is really needed are ORBs that can be easily extended. Interceptors provide a general mechanism to support extensibility, but the question is whether the two types of interceptors as provided in CORBA are really the ones we need. More on interceptors from a software architecture point of view can be found in( Schmidt et al., 2000).
Portable Object Adapter
In Chap. 3, we described in detail the notion of an object adapter, which is a mechanism that implements a specific activation policy for a group of objects. For example, one adapter may implement a method invocation using a separate thread for each invocation, whereas another one uses only a single thread for all the