package io.cattle.platform.eventing.impl; import io.cattle.platform.async.utils.AsyncUtils; import io.cattle.platform.eventing.model.Event; import java.util.Random; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import javax.inject.Inject; import org.apache.commons.pool2.PooledObject; import org.apache.commons.pool2.PooledObjectFactory; import org.apache.commons.pool2.impl.DefaultPooledObject; public class ListenerPoolObjectFactory implements PooledObjectFactory<FutureEventListener> { String prefix = Event.REPLY_PREFIX; AbstractEventService eventService; Random random = new Random(); public ListenerPoolObjectFactory() { } public ListenerPoolObjectFactory(AbstractEventService eventService) { super(); this.eventService = eventService; } @Override public PooledObject<FutureEventListener> makeObject() throws Exception { String key = prefix + Math.abs(random.nextLong()); FutureEventListener listener = new FutureEventListener(eventService, key); Future<?> future = eventService.subscribe(key, listener); AsyncUtils.get(future, 10, TimeUnit.SECONDS); return new DefaultPooledObject<FutureEventListener>(listener); } @Override public void destroyObject(PooledObject<FutureEventListener> p) throws Exception { eventService.unsubscribe(p.getObject()); } @Override public boolean validateObject(PooledObject<FutureEventListener> p) { return !p.getObject().isFailed(); } @Override public void activateObject(PooledObject<FutureEventListener> p) throws Exception { p.getObject().reset(); } @Override public void passivateObject(PooledObject<FutureEventListener> p) throws Exception { p.getObject().reset(); } public String getPrefix() { return prefix; } public void setPrefix(String prefix) { this.prefix = prefix; } public AbstractEventService getEventService() { return eventService; } @Inject public void setEventService(AbstractEventService eventService) { this.eventService = eventService; } }