package se.pp.gustafson.marten.logback.appender;
import java.util.concurrent.TimeUnit;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smackx.muc.MultiUserChat;
public final class SendThread extends Thread
{
private final MultiUserChat chat;
private final SloppyCircularBuffer<String> queue;
public SendThread(final MultiUserChat chat, final int backlog)
{
this.queue = new SloppyCircularBuffer<String>(backlog);
this.chat = chat;
super.setDaemon(true);
super.setName(getClass().getSimpleName());
}
public void enqueue(final String message)
{
this.queue.enqueue(message);
}
@Override
public void run()
{
try
{
String message;
while(this.chat.isJoined() && !isInterrupted())
{
int counter = 0;
while(!isInterrupted() && null != (message = this.queue.dequeue(10, TimeUnit.MILLISECONDS)))
{
send(message);
counter = yieldEveryHundredIteration(counter++);
}
Thread.sleep(500);
}
}
catch(final InterruptedException exitSignal)
{}
}
private static int yieldEveryHundredIteration(int counter)
{
if(0 == (counter % 100))
{
Thread.yield();
return 0;
}
return counter;
}
private void send(final String message)
{
try
{
this.chat.sendMessage(message);
}
catch(final XMPPException e)
{
System.err.println("Ignored:");
e.printStackTrace(System.err);
}
}
}