server = org.apache.openejb.server.discovery.MultipointDiscoveryAgent
bind = 127.0.0.1
port = 4212
disabled = false
initialServers = 192.168.1.20:4212, 192.168.1.30:4212, 192.168.1.40:4212
Multipoint (TCP) Discovery
As TCP has no real broadcast functionality to speak of, communication of who is in the network is achieved by each server having a physical connection to each other server in the network.
To join the network, the server must be configured to know the address of at least one server in the network and connect to it. When it does both servers will exchange the full list of all the other servers each knows about. Each server will then connect to any new servers they’ve just learned about and repeat the processes with those new servers. The end result is that everyone has a direct connection to everyone 100% of the time, hence the made-up term "multipoint" to describe this situation of each server having multiple point-to-point connections which create a fully connected graph.
On the client side things are similar. It needs to know the address of at least one server in the network and be able to connect to it. When it does it will get the full (and dynamically maintained) list of every server in the network. The client doesn’t connect to each of those servers immediately, but rather consults the list in the event of a failover, using it to decide who to connect to next.
The entire process is essentially the art of using a statically maintained list to bootstrap getting the more valuable dynamically maintained list.
Server Configuration
In the server this list can be specified via the
conf/multipoint.properties
file like so:
The above configuration shows the server has an port
4212
open for
connections by other servers for multipoint communication. The
initialServers
list should be a comma separated list of other similar
servers on the network. Only one of the servers listed is required to be
running when this server starts up — it is not required to list all
servers in the network.
Client Configuration
Configuration in the client is similar, but note that EJB clients do not
participate directly in multipoint communication and do not connect to
the multipoint port. The server list is simply a list of the regular
ejbd://
urls that a client normally uses to connect to a server.
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
p.put(Context.PROVIDER_URL, "failover:ejbd://192.168.1.20:4201,ejbd://192.168.1.30:4201");
InitialContext remoteContext = new InitialContext(p);
Failover can work entirely driven by the server, the client does not need to be configured to participate. A client can connect as usual to the server.
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
p.put(Context.PROVIDER_URL, "ejbd://192.168.1.20:4201");
InitialContext remoteContext = new InitialContext(p);
If the server at 192.168.1.20:4201
supports failover, so will the
client.
In this scenario the list of servers used for failover is supplied
entirely by the server at 192.168.1.20:4201
. The server could have
aquired the list via multicast or multipoint (or both), but this detail
is not visible to the client.