private TestHandler getTestHandler(PartitionProcessor processor) { return (TestHandler) processor.getTypeDictionary().messageHandlerFor(null); }
@Test public void testCreateFromClasspath() { // The ReflectionTypeDictionaryFactory is robust by design, so it does not throw any Exception. // Need to check the log output for the error test cases. // Dependency injection magic ServiceProperties serviceProperites = new ServiceProperties(); Module[] modules = new Module[1]; modules[0] = new TestInjectionModule(serviceProperites); Injector injector = Guice.createInjector(modules); ReflectionTypeDictionaryFactory rtdf = new ReflectionTypeDictionaryFactory(injector); TypeDictionary dictionary = rtdf.createFromClasspath(); MessageHandler<? extends com.google.protobuf.Message> handler = dictionary.messageHandlerFor(MessageType.of(TypeDictionaryTest.class)); assertNotNull(handler); MessageHandler<? extends com.google.protobuf.Message> unknownHandler = dictionary.messageHandlerFor(MessageType.of(TestMessageWithNoHandler.class)); assertNull(unknownHandler); Parser parser = dictionary.parserFor((MessageType.of(TypeDictionaryTest.class))); assertNotNull(parser); assertNull(dictionary.parserFor(new MessageType("UnknownType"))); }
@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); } }