private Message<? extends com.google.protobuf.Message> parseMessage() { Envelope envelope = null; try { envelope = Envelope.parseFrom(record.value()); } catch (InvalidProtocolBufferException parseError) { markAsConsumed(record.offset()); parsingFailed(envelope, parseError); return null; } try { MessageType type = new MessageType(envelope.getMessageType()); Parser<com.google.protobuf.Message> parser = typeDictionary.parserFor(type); if (parser == null) { throw new UnknownMessageTypeException(type); } com.google.protobuf.Message innerMessage = parser.parseFrom(envelope.getInnerMessage()); return Messages.fromKafka(innerMessage, envelope, record); } catch (InvalidProtocolBufferException | UnknownMessageTypeException unrecoverableParsingError) { markAsConsumed(record.offset()); parsingFailed(envelope, unrecoverableParsingError); return null; } }
@SuppressWarnings("unchecked") private void deliverToMessageHandler(Message message) { boolean tryDeliverMessage = true; boolean deliveryFailed = true; OrangeContext context = message.getMetadata().newContextFromMetadata(); try { while (tryDeliverMessage) { try { MessageType messageType = message.getMetadata().getType(); MessageHandler handler = typeDictionary.messageHandlerFor(messageType); if (handler == null) { throw new UnknownMessageHandlerException(messageType); } deliveryStarted(message, handler, context); // Leave the framework here: hand over execution to service-specific handler. handler.onMessage(message, context); deliveryFailed = false; break; } catch (Exception failure) { // Strategy decides: Should we retry to deliver the failed message? tryDeliverMessage = failedMessageProcessor.onFailedMessage(message, failure); deliveryFailed(message, failure, tryDeliverMessage); } } } finally { // consume the message - even if delivery failed markAsConsumed(message.getMetadata().getOffset()); deliveryEnded(message, deliveryFailed); } }