@Override public void onFailure(Throwable t) { if (cancelled) { return; } t = adjustThrowable(t); if (handleInternalException(t)) { next(); } else { cancel(); } }
public boolean isListenerCancelled(String registrationID) { checkNotNull(registrationID, "registrationId can't be null"); MessageRunner runner = runnersMap.get(registrationID); if (runner == null) { return true; } return runner.isCancelled(); }
@Override public void onResponse(ReadResultSet<ReliableTopicMessage> result) { // we process all messages in batch. So we don't release the thread and reschedule ourselves; // but we'll process whatever was received in 1 go. for (Object item : result) { ReliableTopicMessage message = (ReliableTopicMessage) item; if (cancelled) { return; } try { listener.storeSequence(sequence); process(message); } catch (Throwable t) { if (terminate(t)) { cancel(); return; } } sequence++; } next(); }
/** * @param t throwable to check if it is terminal or can be handled so that topic can continue * @return true if the exception was handled and the listener may continue reading */ protected boolean handleInternalException(Throwable t) { if (t instanceof OperationTimeoutException) { return handleOperationTimeoutException(); } else if (t instanceof IllegalArgumentException) { return handleIllegalArgumentException((IllegalArgumentException) t); } else if (t instanceof StaleSequenceException) { return handleStaleSequenceException((StaleSequenceException) t); } else if (t instanceof HazelcastInstanceNotActiveException) { if (logger.isFinestEnabled()) { logger.finest("Terminating MessageListener " + listener + " on topic: " + topicName + ". " + " Reason: HazelcastInstance is shutting down"); } } else if (t instanceof DistributedObjectDestroyedException) { if (logger.isFinestEnabled()) { logger.finest("Terminating MessageListener " + listener + " on topic: " + topicName + ". " + "Reason: Topic is destroyed"); } } else { logger.warning("Terminating MessageListener " + listener + " on topic: " + topicName + ". " + "Reason: Unhandled exception, message: " + t.getMessage(), t); } return false; }
@Override public String addMessageListener(MessageListener<E> listener) { checkNotNull(listener, NULL_LISTENER_IS_NOT_ALLOWED); String id = UuidUtil.newUnsecureUuidString(); ReliableMessageListener<E> reliableMessageListener = toReliableMessageListener(listener); MessageRunner<E> runner = new ClientReliableMessageRunner<E>(id, reliableMessageListener, ringbuffer, name, config.getReadBatchSize(), serializationService, executor, runnersMap, logger); runnersMap.put(id, runner); runner.next(); return id; }
@Override public boolean removeMessageListener(String registrationId) { checkNotNull(registrationId, "registrationId can't be null"); MessageRunner runner = runnersMap.get(registrationId); if (runner == null) { return false; } runner.cancel(); return true; }
@Override protected boolean handleInternalException(Throwable t) { if (t instanceof HazelcastClientOfflineException) { if (logger.isFinestEnabled()) { logger.finest("MessageListener " + listener + " on topic: " + topicName + " got exception: " + t + ". Continuing from last known sequence: " + sequence); } return true; } return super.handleInternalException(t); }
private Message<E> toMessage(ReliableTopicMessage m) { Member member = getMember(m); E payload = serializationService.toObject(m.getPayload()); return new Message<E>(topicName, payload, m.getPublishTime(), member); }
/** * Handles a {@link StaleSequenceException} associated with requesting * a sequence older than the {@code headSequence}. * This may indicate that the reader was too slow and items in the * ringbuffer were already overwritten. * * @param staleSequenceException the exception * @return if the exception was handled and the listener may continue reading */ private boolean handleStaleSequenceException(StaleSequenceException staleSequenceException) { long headSeq = getHeadSequence(staleSequenceException); if (listener.isLossTolerant()) { if (logger.isFinestEnabled()) { logger.finest("MessageListener " + listener + " on topic: " + topicName + " ran into a stale sequence. " + "Jumping from oldSequence: " + sequence + " to sequence: " + headSeq); } sequence = headSeq; return true; } logger.warning("Terminating MessageListener:" + listener + " on topic: " + topicName + ". " + "Reason: The listener was too slow or the retention period of the message has been violated. " + "head: " + headSeq + " sequence:" + sequence); return false; }
@Override public void onResponse(ReadResultSet<ReliableTopicMessage> result) { // we process all messages in batch. So we don't release the thread and reschedule ourselves; // but we'll process whatever was received in 1 go. for (Object item : result) { ReliableTopicMessage message = (ReliableTopicMessage) item; if (cancelled) { return; } try { listener.storeSequence(sequence); process(message); } catch (Throwable t) { if (terminate(t)) { cancel(); return; } } sequence++; } next(); }
/** * @param t throwable to check if it is terminal or can be handled so that topic can continue * @return true if the exception was handled and the listener may continue reading */ protected boolean handleInternalException(Throwable t) { if (t instanceof OperationTimeoutException) { return handleOperationTimeoutException(); } else if (t instanceof IllegalArgumentException) { return handleIllegalArgumentException((IllegalArgumentException) t); } else if (t instanceof StaleSequenceException) { return handleStaleSequenceException((StaleSequenceException) t); } else if (t instanceof HazelcastInstanceNotActiveException) { if (logger.isFinestEnabled()) { logger.finest("Terminating MessageListener " + listener + " on topic: " + topicName + ". " + " Reason: HazelcastInstance is shutting down"); } } else if (t instanceof DistributedObjectDestroyedException) { if (logger.isFinestEnabled()) { logger.finest("Terminating MessageListener " + listener + " on topic: " + topicName + ". " + "Reason: Topic is destroyed"); } } else { logger.warning("Terminating MessageListener " + listener + " on topic: " + topicName + ". " + "Reason: Unhandled exception, message: " + t.getMessage(), t); } return false; }
@Override public String addMessageListener(MessageListener<E> listener) { checkNotNull(listener, NULL_LISTENER_IS_NOT_ALLOWED); String id = UuidUtil.newUnsecureUuidString(); ReliableMessageListener<E> reliableMessageListener = toReliableMessageListener(listener); MessageRunner<E> runner = new ClientReliableMessageRunner<E>(id, reliableMessageListener, ringbuffer, name, config.getReadBatchSize(), serializationService, executor, runnersMap, logger); runnersMap.put(id, runner); runner.next(); return id; }
@Override public boolean removeMessageListener(String registrationId) { checkNotNull(registrationId, "registrationId can't be null"); MessageRunner runner = runnersMap.get(registrationId); if (runner == null) { return false; } runner.cancel(); return true; }
@Override protected boolean handleInternalException(Throwable t) { if (t instanceof HazelcastClientOfflineException) { if (logger.isFinestEnabled()) { logger.finest("MessageListener " + listener + " on topic: " + topicName + " got exception: " + t + ". Continuing from last known sequence: " + sequence); } return true; } return super.handleInternalException(t); }
private Message<E> toMessage(ReliableTopicMessage m) { Member member = getMember(m); E payload = serializationService.toObject(m.getPayload()); return new Message<E>(topicName, payload, m.getPublishTime(), member); }
/** * Handles a {@link StaleSequenceException} associated with requesting * a sequence older than the {@code headSequence}. * This may indicate that the reader was too slow and items in the * ringbuffer were already overwritten. * * @param staleSequenceException the exception * @return if the exception was handled and the listener may continue reading */ private boolean handleStaleSequenceException(StaleSequenceException staleSequenceException) { long headSeq = getHeadSequence(staleSequenceException); if (listener.isLossTolerant()) { if (logger.isFinestEnabled()) { logger.finest("MessageListener " + listener + " on topic: " + topicName + " ran into a stale sequence. " + "Jumping from oldSequence: " + sequence + " to sequence: " + headSeq); } sequence = headSeq; return true; } logger.warning("Terminating MessageListener:" + listener + " on topic: " + topicName + ". " + "Reason: The listener was too slow or the retention period of the message has been violated. " + "head: " + headSeq + " sequence:" + sequence); return false; }
@Override public void onFailure(Throwable t) { if (cancelled) { return; } t = adjustThrowable(t); if (handleInternalException(t)) { next(); } else { cancel(); } }
@Override public String addMessageListener(MessageListener<E> listener) { checkNotNull(listener, "listener can't be null"); String id = UuidUtil.newUnsecureUuidString(); ReliableMessageListener<E> reliableMessageListener; if (listener instanceof ReliableMessageListener) { reliableMessageListener = (ReliableMessageListener) listener; } else { reliableMessageListener = new ReliableMessageListenerAdapter<E>(listener); } MessageRunner<E> runner = new ReliableMessageRunner<E>(id, reliableMessageListener, nodeEngine.getSerializationService(), executor, nodeEngine.getLogger(this.getClass()), nodeEngine.getClusterService(), this); runnersMap.put(id, runner); runner.next(); return id; }
@Override public boolean removeMessageListener(String registrationId) { checkNotNull(registrationId, "registrationId can't be null"); MessageRunner runner = runnersMap.get(registrationId); if (runner == null) { return false; } runner.cancel(); return true; }
public boolean isListenerCancelled(String registrationID) { checkNotNull(registrationID, "registrationId can't be null"); MessageRunner runner = runnersMap.get(registrationID); if (runner == null) { return true; } return runner.isCancelled(); }