/**
* Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT
* All rights reserved. Use is subject to license terms. See LICENSE.TXT
*/
package org.diirt.support.ca;
import static org.diirt.datasource.ExpressionLanguage.channel;
import static org.diirt.util.time.TimeDuration.ofHertz;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import org.diirt.datasource.PVManager;
import org.diirt.datasource.PVReader;
import org.diirt.datasource.PVReaderEvent;
import org.diirt.datasource.PVReaderListener;
/**
* This class tests connecting, getting a value,
* then closing and doing the same again,
* usually with another channel name.
*
* @author carcassi, Kay Kasemir
*/
public class JCAClientNotificationCount
{
public static void main(String[] args) throws Exception
{
final JCADataSource jca = new JCADataSourceProvider().createInstance();
PVManager.setDefaultDataSource(jca);
final String[] names =
{
"text",
"text {\"longString\":true}",
"TEST_1"
};
final Random rand = new Random(1);
final AtomicInteger runs = new AtomicInteger(0);
final AtomicInteger connections = new AtomicInteger(0);
final AtomicInteger values = new AtomicInteger(0);
int countToPrint = 10;
while (true)
{
final String name = names[rand.nextInt(names.length)];
final CountDownLatch done = new CountDownLatch(1);
System.out.print(name + " = ");
final PVReader<?> pv = PVManager.read(channel(name))
.readListener(new PVReaderListener<Object>()
{
@Override
public void pvChanged(PVReaderEvent<Object> event)
{
if (event.isExceptionChanged()) {
event.getPvReader().lastException().printStackTrace();
}
if (event.isConnectionChanged())
{
connections.incrementAndGet();
System.out.print("[C] ");
}
if (event.isValueChanged())
{
System.out.println(event.getPvReader().getValue());
values.incrementAndGet();
done.countDown();
}
}
}).maxRate(ofHertz(100));
runs.incrementAndGet();
if (! done.await(10, TimeUnit.SECONDS)) {
System.out.println("NO VALUE");
System.out.println(jca.getChannels().get(name).getProperties());
pv.close();
System.out.println("Closed");
} else {
pv.close();
}
if (runs.get() == countToPrint)
{
System.out.println("Runs: " + runs
+ " Connections: " + connections
+ " Values: " + values);
countToPrint += 10;
}
}
}
}