package org.distributeme.core.listener;
import org.distributeme.core.RMIRegistryUtil;
import org.distributeme.core.RegistryUtil;
import org.distributeme.core.ServiceDescriptor;
import org.distributeme.core.util.LocalServiceDescriptorStore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.nio.charset.Charset;
import java.util.List;
/**
* This listener activates a UDP socket and listens for the incoming packets. If the packet contains the register command,
* it triggers a reregistration.
*
* @author lrosenberg
* @since 22.02.15 17:51
* @version $Id: $Id
*/
public class UDPReregistrationListener implements ServerLifecycleListener{
/**
* Logger.
*/
private static Logger log = LoggerFactory.getLogger(UDPReregistrationListener.class);
/**
* Cmd string for registration.
*/
public static final String CMD_REGISTER = "register";
/** {@inheritDoc} */
@Override
public void afterStart() {
int port = RMIRegistryUtil.getRmiRegistryPort();
log.debug("Trying to setup incoming UDP Server on port: "+port);
startUdpServer(port);
}
/** {@inheritDoc} */
@Override
public void beforeShutdown() {
}
/**
* Starts a server on a given port.
* @param port
*/
private void startUdpServer(int port){
try {
final DatagramSocket serverSocket = new DatagramSocket(port);
final Thread receiver = new Thread(new Runnable() {
@Override
public void run() {
while(true) {
DatagramPacket incomingPacket = new DatagramPacket(new byte[100], 100);
try {
serverSocket.receive(incomingPacket);
String command = new String(incomingPacket.getData(), Charset.defaultCharset());
command = command.trim();
System.out.println("Incoming command: "+command+".");
if (command != null && command.equals(CMD_REGISTER))
register();
} catch (IOException e) {
log.warn("Can't parse incoming packet", e);
}
}
}
});
receiver.start();
}catch(IOException e){
log.warn("Can't create server socket", e);
}
}
/**
* Registration command.
*/
private void register(){
List<ServiceDescriptor> descriptors = LocalServiceDescriptorStore.getInstance().getServiceDescriptors();
System.out.println("Have to register following descriptors: "+descriptors);
for (ServiceDescriptor descriptor : descriptors){
if (!RegistryUtil.bind(descriptor)){
log.error("Couldn't re-bind myself to the central registry at "+ RegistryUtil.describeRegistry()+" for "+descriptor);
System.err.println("Couldn't re-bind myself at the central registry at "+ RegistryUtil.describeRegistry()+" for "+descriptor);
}
}
}
}