package org.frameworkset.remote; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.frameworkset.event.Event; import org.jgroups.Address; import org.jgroups.JChannel; import org.jgroups.ReceiverAdapter; import org.jgroups.blocks.RequestOptions; import org.jgroups.blocks.ResponseMode; import org.jgroups.blocks.RpcDispatcher; public class EventRPCDispatcher extends ReceiverAdapter implements org.frameworkset.spi.InitializingBean, org.frameworkset.spi.DisposableBean { private static Logger log = Logger.getLogger(EventRPCDispatcher.class); private JChannel channel; private RpcDispatcher rpcDispatcher; RpcDispatcherAnycastServerObject target; EventRemoteService eventService; final String GROUP = "EventRpcDispatcherMultipleCalls"; public EventRPCDispatcher() { } public Address getLocalAddress() { return this.channel.getAddress(); } public boolean containSelf( List<Address> addresses) { Address address = this.channel.getAddress(); for(Address ad:addresses) { if(ad.equals(address) ) return true; } return false; } public List<Address> removeSelf( List<Address> addresses) { Address address = this.channel.getAddress(); List<Address> temp = new ArrayList(); temp.addAll(addresses); temp.remove(address); return temp; } public void callRemote(boolean excludeSelf, Event<?> event) throws Exception { // we need to copy the vector, otherwise the modification below will // throw an exception because the underlying // vector is unmodifiable List<Address> v = new ArrayList<Address>(); v.addAll(channel.getView().getMembers()); if (excludeSelf) { v.remove(channel.getAddress()); if(v.size() == 0) return ; boolean use_anycasting = true; rpcDispatcher.callRemoteMethods(v, "remoteEventChange", new Object[] {event}, new Class[] { Event.class }, new RequestOptions(ResponseMode.GET_NONE, 0,use_anycasting)); } else { rpcDispatcher.callRemoteMethods(null, "remoteEventChange", new Object[] {event}, new Class[] { Event.class }, new RequestOptions(ResponseMode.GET_NONE, 0)); } } public List<Address> getAddresses() { if(this.channel != null) { List<Address> v = new ArrayList<Address>(); v.addAll(channel.getView().getMembers()); return v; } return null; } public void callRemote( List<Address> addresses, Event<?> event) throws Exception { // we need to copy the vector, otherwise the modification below will // throw an exception because the underlying // vector is unmodifiable boolean use_anycasting = true; rpcDispatcher.callRemoteMethods(addresses, "remoteEventChange", new Object[] {event}, new Class[] { Event.class }, new RequestOptions(ResponseMode.GET_NONE, 0,use_anycasting)); } public void callRemote( Event<?> event) throws Exception { callRemote(false, event); } private void shutdown() { if(channel != null) { log.debug("Event RpcDispatcher Service shutdownding."); channel.close(); log.debug("Event RpcDispatcher Service shutdownded."); } } public void init() throws Exception { log.debug("Event RpcDispatcher Service starting."); channel = createChannel(); rpcDispatcher = new RpcDispatcher(channel, eventService); rpcDispatcher.setMembershipListener(this); rpcDispatcher.setStateListener(this); channel.connect(GROUP); log.debug("Event RpcDispatcher Service started."); // BaseApplicationContext.addShutdownHook(new Runnable() { // // public void run() { // shutdown(); // } // // }); } private JChannel createChannel() throws Exception { return new JChannel(EventUtils.getProtocolConfigFile()); } public void destroy() throws Exception { shutdown(); } public void afterPropertiesSet() throws Exception { // channel = createChannel(); // rpcDispatcher = new RpcDispatcher(channel, this, this, eventService); // // channel.connect(GROUP); init() ; } }