Spring features integration classes for remoting support using various technologies. The remoting support eases the development of remote-enabled services, implemented by your usual (Spring) POJOs. Currently, Spring supports four remoting technologies:
Remote Method Invocation (RMI). Through
the use of the RmiProxyFactoryBean
and the
RmiServiceExporter
Spring supports both
traditional RMI (with java.rmi.Remote
interfaces and
java.rmi.RemoteException
) and
transparent remoting via RMI invokers (with any Java
interface).
Spring's HTTP invoker. Spring provides a
special remoting strategy which allows for Java serialization via
HTTP, supporting any Java interface (just like the RMI invoker). The
corresponding support classes are
HttpInvokerProxyFactoryBean
and
HttpInvokerServiceExporter
.
Hessian. By using Spring's
HessianProxyFactoryBean
and the
HessianServiceExporter
you can transparently
expose your services using the lightweight binary HTTP-based
protocol provided by Caucho.
Burlap. Burlap is Caucho's XML-based
alternative to Hessian. Spring provides support classes such as
BurlapProxyFactoryBean
and
BurlapServiceExporter
.
JAX-RPC. Spring provides remoting support for web services via JAX-RPC (J2EE 1.4's web service API).
JAX-WS. Spring provides remoting support for web services via JAX-WS (the successor of JAX-RPC, as introduced in Java EE 5 and Java 6).
JMS. Remoting using JMS as the underlying
protocol is supported via the
JmsInvokerServiceExporter
and
JmsInvokerProxyFactoryBean
classes.
While discussing the remoting capabilities of Spring, we'll use the following domain model and corresponding services:
public class Account implements Serializable{ private String name; public String getName(){ return name; } public void setName(String name) { this.name = name; } }
public interface AccountService { public void insertAccount(Account account); public List<Account> getAccounts(String name); }
public interface RemoteAccountService extends Remote { public void insertAccount(Account account) throws RemoteException; public List<Account> getAccounts(String name) throws RemoteException; }
// the implementation doing nothing at the moment public class AccountServiceImpl implements AccountService { public void insertAccount(Account acc) { // do something... } public List<Account> getAccounts(String name) { // do something... } }
We will start exposing the service to a remote client by using RMI and talk a bit about the drawbacks of using RMI. We'll then continue to show an example using Hessian as the protocol.