// Copyright (c) 2001 Dustin Sallings <dustin@spy.net>
package net.spy.cache;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import net.spy.SpyThread;
/**
* Listen for multicast request to clear cache for a given prefix.
*/
public class CacheClearRequestListener extends SpyThread {
private final MulticastSocket s;
private final InetAddress group;
private final int port;
private int requests=0;
private volatile boolean running=true;
/**
* Get an instance of CacheClearRequestListener.
*/
public CacheClearRequestListener(InetAddress g, int p)
throws IOException {
super();
getLogger().info("Starting multicast cache listener on %s:%d", g, p);
setDaemon(true);
setName("SpyCacheClearRequestListener");
group=g;
port=p;
s=makeMCastSocket(port);
s.joinGroup(g);
start();
}
protected MulticastSocket makeMCastSocket(int p) throws IOException {
return new MulticastSocket(p);
}
/**
* String me.
*/
@Override
public String toString() {
return super.toString()
+ " on " + group.getHostAddress() + ":" + port
+ " processed " + requests + " requests";
}
/**
* Tell the thing to stop running.
*/
public void stopRunning() {
running=false;
try {
s.leaveGroup(group);
s.close();
} catch(IOException ioe) {
getLogger().error("IOException when leaving group", ioe);
}
}
/**
* Do that crazy flush thing.
*/
public void flush(DatagramPacket recv) {
byte[] data=recv.getData();
byte[] tmp=new byte[recv.getLength()];
System.arraycopy(data, 0, tmp, 0, tmp.length);
String prefix=new String(tmp);
getLogger().info("CacheClearRequestListener flushing ``%s''"
+ " per mcast req from %s", prefix, recv.getAddress());
requests++;
// Do it.
SpyCache cache=SpyCache.getInstance();
cache.uncacheLike(prefix);
}
/**
* Run.
*/
@Override
public void run() {
while(running) {
try {
byte[] data=new byte[1500];
DatagramPacket recv = new DatagramPacket(data, data.length);
s.receive(recv);
flush(recv);
} catch(IOException e) {
getLogger().error("IOException processing packet.", e);
}
}
}
}