@Test
public void testCustomExecutor() throws Exception
{
final int ITERATIONS = 1000;
Timing timing = new Timing();
DistributedQueue<String> queue = null;
final CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), timing.session(), timing.connection(), new RetryOneTime(1));
client.start();
try
{
final CountDownLatch latch = new CountDownLatch(ITERATIONS);
QueueConsumer<String> consumer = new QueueConsumer<String>()
{
@Override
public void consumeMessage(String message) throws Exception
{
latch.countDown();
}
@Override
public void stateChanged(CuratorFramework client, ConnectionState newState)
{
}
};
QueueSerializer<String> serializer = new QueueSerializer<String>()
{
@Override
public byte[] serialize(String item)
{
return item.getBytes();
}
@Override
public String deserialize(byte[] bytes)
{
return new String(bytes);
}
};
Executor executor = Executors.newCachedThreadPool();
final Set<String> used = Sets.newHashSet();
final Set<String> doubleUsed = Sets.newHashSet();
queue = new DistributedQueue<String>
(
client,
consumer,
serializer,
QUEUE_PATH,
QueueBuilder.defaultThreadFactory,
executor,
Integer.MAX_VALUE,
false,
"/lock",
QueueBuilder.NOT_SET,
true,
5000
)
{
@SuppressWarnings("SimplifiableConditionalExpression")
@Override
protected boolean processWithLockSafety(String itemNode, DistributedQueue.ProcessType type) throws Exception
{
if ( used.contains(itemNode) )
{
doubleUsed.add(itemNode);
}
else
{
used.add(itemNode);
}
return (client.getState() == CuratorFrameworkState.STARTED) ? super.processWithLockSafety(itemNode, type) : false;
}
};
queue.start();
for ( int i = 0; i < ITERATIONS; ++i )
{
queue.put(Integer.toString(i));
}
Assert.assertTrue(timing.awaitLatch(latch));
Assert.assertTrue(doubleUsed.size() == 0, doubleUsed.toString());
}
finally
{