use of org.glassfish.jersey.media.sse.EventListener in project jersey by jersey.
the class ItemStoreResourceTest method testItemsStore.
/**
* Test the item addition, addition event broadcasting and item retrieval from {@link ItemStoreResource}.
*
* @throws Exception in case of a test failure.
*/
@Test
public void testItemsStore() throws Exception {
final List<String> items = Collections.unmodifiableList(Arrays.asList("foo", "bar", "baz"));
final WebTarget itemsTarget = target("items");
// countdown on all events
final CountDownLatch latch = new CountDownLatch(items.size() * MAX_LISTENERS * 2);
final List<Queue<Integer>> indexQueues = new ArrayList<Queue<Integer>>(MAX_LISTENERS);
final EventSource[] sources = new EventSource[MAX_LISTENERS];
final AtomicInteger sizeEventsCount = new AtomicInteger(0);
for (int i = 0; i < MAX_LISTENERS; i++) {
final int id = i;
final EventSource es = EventSource.target(itemsTarget.path("events")).named("SOURCE " + id).build();
sources[id] = es;
final Queue<Integer> indexes = new ConcurrentLinkedQueue<Integer>();
indexQueues.add(indexes);
es.register(new EventListener() {
@SuppressWarnings("MagicNumber")
@Override
public void onEvent(InboundEvent inboundEvent) {
try {
if (inboundEvent.getName() == null) {
final String data = inboundEvent.readData();
LOGGER.info("[-i-] SOURCE " + id + ": Received event id=" + inboundEvent.getId() + " data=" + data);
indexes.add(items.indexOf(data));
} else if ("size".equals(inboundEvent.getName())) {
sizeEventsCount.incrementAndGet();
}
} catch (Exception ex) {
LOGGER.log(Level.SEVERE, "[-x-] SOURCE " + id + ": Error getting event data.", ex);
indexes.add(-999);
} finally {
latch.countDown();
}
}
});
}
try {
open(sources);
for (String item : items) {
postItem(itemsTarget, item);
}
assertTrue("Waiting to receive all events has timed out.", latch.await((1000 + MAX_LISTENERS * EventSource.RECONNECT_DEFAULT) * getAsyncTimeoutMultiplier(), TimeUnit.MILLISECONDS));
// need to force disconnect on server in order for EventSource.close(...) to succeed with HttpUrlConnection
sendCommand(itemsTarget, "disconnect");
} finally {
close(sources);
}
String postedItems = itemsTarget.request().get(String.class);
for (String item : items) {
assertTrue("Item '" + item + "' not stored on server.", postedItems.contains(item));
}
int queueId = 0;
for (Queue<Integer> indexes : indexQueues) {
for (int i = 0; i < items.size(); i++) {
assertTrue("Event for '" + items.get(i) + "' not received in queue " + queueId, indexes.contains(i));
}
assertEquals("Not received the expected number of events in queue " + queueId, items.size(), indexes.size());
queueId++;
}
assertEquals("Number of received 'size' events does not match.", items.size() * MAX_LISTENERS, sizeEventsCount.get());
}
use of org.glassfish.jersey.media.sse.EventListener in project jersey by jersey.
the class EventOutputTest method testGrizzlyConnectorWithEventSource.
@Test
public void testGrizzlyConnectorWithEventSource() throws InterruptedException {
ClientConfig clientConfig = new ClientConfig();
clientConfig.property(ClientProperties.CONNECT_TIMEOUT, 15000);
clientConfig.property(ClientProperties.READ_TIMEOUT, 0);
clientConfig.property(ClientProperties.ASYNC_THREADPOOL_SIZE, 8);
clientConfig.connectorProvider(new GrizzlyConnectorProvider());
Client client = ClientBuilder.newBuilder().withConfig(clientConfig).build();
final CountDownLatch latch = new CountDownLatch(1);
final AtomicReference<String> eventData = new AtomicReference<String>();
final AtomicInteger counter = new AtomicInteger(0);
WebTarget single = client.target(getBaseUri()).path("test/single");
EventSource es = EventSource.target(single).build();
es.register(new EventListener() {
@Override
public void onEvent(InboundEvent inboundEvent) {
final int i = counter.incrementAndGet();
if (i == 1) {
eventData.set(inboundEvent.readData());
}
latch.countDown();
}
});
boolean latchTimedOut;
boolean closeTimedOut;
try {
es.open();
latchTimedOut = latch.await(5 * getAsyncTimeoutMultiplier(), TimeUnit.SECONDS);
} finally {
closeTimedOut = es.close(5, TimeUnit.SECONDS);
}
assertEquals("Unexpected event count", 1, counter.get());
assertEquals("Unexpected event data", "single", eventData.get());
assertTrue("Event latch has timed out", latchTimedOut);
assertTrue("EventSource.close() has timed out", closeTimedOut);
}
use of org.glassfish.jersey.media.sse.EventListener in project jersey by jersey.
the class EventOutputTest method testReadCommentsOnlySseEvents.
/**
* Reproducer for JERSEY-2912: Sending and receiving comments-only events.
*
* @throws Exception
*/
@Test
public void testReadCommentsOnlySseEvents() throws Exception {
ClientConfig clientConfig = new ClientConfig();
clientConfig.property(ClientProperties.CONNECT_TIMEOUT, 15000);
clientConfig.property(ClientProperties.READ_TIMEOUT, 0);
clientConfig.property(ClientProperties.ASYNC_THREADPOOL_SIZE, 8);
clientConfig.connectorProvider(new GrizzlyConnectorProvider());
Client client = ClientBuilder.newBuilder().withConfig(clientConfig).build();
final CountDownLatch latch = new CountDownLatch(2);
final Queue<String> eventComments = new ArrayBlockingQueue<>(2);
WebTarget single = client.target(getBaseUri()).path("test/comments-only");
EventSource es = EventSource.target(single).build();
es.register(new EventListener() {
@Override
public void onEvent(InboundEvent inboundEvent) {
eventComments.add(inboundEvent.getComment());
latch.countDown();
}
});
boolean latchTimedOut;
boolean closeTimedOut;
try {
es.open();
latchTimedOut = latch.await(5 * getAsyncTimeoutMultiplier(), TimeUnit.SECONDS);
} finally {
closeTimedOut = es.close(5, TimeUnit.SECONDS);
}
assertEquals("Unexpected event count", 2, eventComments.size());
for (int i = 1; i <= 2; i++) {
assertEquals("Unexpected comment data on event #" + i, "No comment #" + i, eventComments.poll());
}
assertTrue("Event latch has timed out", latchTimedOut);
assertTrue("EventSource.close() has timed out", closeTimedOut);
}
use of org.glassfish.jersey.media.sse.EventListener in project jersey by jersey.
the class EventSourceWithNamedEventsTest method testWithEventSource.
@Test
public void testWithEventSource() throws IOException, NoSuchAlgorithmException, InterruptedException {
final WebTarget endpoint = target().register(SseFeature.class).path("events");
EventSource eventSource = EventSource.target(endpoint).build();
final CountDownLatch count = new CountDownLatch(MSG_COUNT);
final EventListener listener = new EventListener() {
@Override
public void onEvent(InboundEvent inboundEvent) {
try {
final Integer data = inboundEvent.readData(Integer.class);
System.out.println(inboundEvent.getName() + "; " + data);
Assert.assertEquals(SSE_NAME, inboundEvent.getName());
Assert.assertEquals(MSG_COUNT - count.getCount(), data.intValue());
count.countDown();
} catch (ProcessingException ex) {
throw new RuntimeException("Error when deserializing of data.", ex);
}
}
};
eventSource.register(listener, "message-to-client");
eventSource.open();
final boolean sent = latch.await(5 * getAsyncTimeoutMultiplier(), TimeUnit.SECONDS);
Assert.assertTrue("Awaiting for SSE message has timeout. Not all message were sent.", sent);
final boolean handled = count.await(5 * getAsyncTimeoutMultiplier(), TimeUnit.SECONDS);
Assert.assertTrue("Awaiting for SSE message has timeout. Not all message were handled by the listener.", handled);
}
use of org.glassfish.jersey.media.sse.EventListener in project jersey by jersey.
the class SseEventSinkToEventSourceTest method testWithJerseyApi.
@Test
public void testWithJerseyApi() throws InterruptedException {
final WebTarget endpoint = target().path("events");
final EventSource eventSource = EventSource.target(endpoint).build();
transmitLatch = new CountDownLatch(MSG_COUNT);
final CountDownLatch receiveLatch = new CountDownLatch(MSG_COUNT);
final List<Integer> results = new ArrayList<>();
final EventListener listener = inboundEvent -> {
try {
results.add(inboundEvent.readData(Integer.class));
receiveLatch.countDown();
Assert.assertEquals(INTEGER_SSE_NAME, inboundEvent.getName());
} catch (ProcessingException ex) {
throw new RuntimeException("Error when deserializing of data.", ex);
}
};
eventSource.register(listener, INTEGER_SSE_NAME);
eventSource.open();
Assert.assertTrue(transmitLatch.await(5000, TimeUnit.MILLISECONDS));
Assert.assertTrue(receiveLatch.await(5000, TimeUnit.MILLISECONDS));
Assert.assertEquals(10, results.size());
}
Aggregations