Exemple #1
0
        public void TestConvertSimpler()
        {
            var searchDirectories            = GetSearchDirectories("TestBinder");
            IServiceProvider serviceProvider = CreateStreamsContainer(searchDirectories, "spring:cloud:stream:bindings:foo:contentType=text/plain").BuildServiceProvider();
            var messageConverter             = serviceProvider.GetService <ISmartMessageConverter>();

            Assert.NotNull(messageConverter);

            var binder = serviceProvider.GetService <IBinder>() as AbstractPollableMessageSourceBinder;

            Assert.NotNull(binder);

            var configurer = serviceProvider.GetService <MessageConverterConfigurer>();

            Assert.NotNull(configurer);

            var options = serviceProvider.GetService <IOptions <BindingServiceOptions> >();

            options.Value.Bindings.TryGetValue("foo", out var bindingOptions);
            Assert.Equal("text/plain", bindingOptions.ContentType);

            var setter        = binder.GetType().GetProperty("MessageSourceDelegate").GetSetMethod();
            var messageSource = new TestMessageSource("foo");

            setter.Invoke(binder, new object[] { messageSource });

            var pollableSource = new DefaultPollableMessageSource(serviceProvider.GetService <IApplicationContext>(), messageConverter);

            configurer.ConfigurePolledMessageSource(pollableSource, "foo");
            var properties = new ConsumerOptions()
            {
                MaxAttempts            = 1,
                BackOffInitialInterval = 0
            };

            properties.PostProcess();

            binder.BindConsumer("foo", "bar", pollableSource, properties);
            var handler = new TestConvertSimpleHandler();

            Assert.True(pollableSource.Poll(handler, typeof(string)));

            Assert.IsType <string>(handler.Payload);
            var str = handler.Payload as string;

            Assert.Equal("foo", str);

            Assert.True(pollableSource.Poll(handler, typeof(string)));

            Assert.IsType <string>(handler.Payload);
            str = handler.Payload as string;
            Assert.Equal("foo", str);
        }
Exemple #2
0
        public void TestConvertSimple()
        {
            var searchDirectories            = GetSearchDirectories("TestBinder");
            IServiceProvider serviceProvider = CreateStreamsContainer(searchDirectories).BuildServiceProvider();
            var messageConverter             = serviceProvider.GetService <ISmartMessageConverter>();

            Assert.NotNull(messageConverter);

            var binder = serviceProvider.GetService <IBinder>() as AbstractPollableMessageSourceBinder;

            Assert.NotNull(binder);

            var configurer = serviceProvider.GetService <MessageConverterConfigurer>();

            Assert.NotNull(configurer);

            var setter        = binder.GetType().GetProperty("MessageSourceDelegate").GetSetMethod();
            var messageSource = new TestMessageSource("{\"foo\":\"bar\"}");

            setter.Invoke(binder, new object[] { messageSource });

            var pollableSource = new DefaultPollableMessageSource(serviceProvider.GetService <IApplicationContext>(), messageConverter);

            configurer.ConfigurePolledMessageSource(pollableSource, "foo");

            var properties = new ConsumerOptions()
            {
                MaxAttempts            = 2,
                BackOffInitialInterval = 0
            };

            properties.PostProcess();

            binder.BindConsumer("foo", "bar", pollableSource, properties);
            var handler = new TestConvertSimpleHandler();

            Assert.True(pollableSource.Poll(handler, typeof(FooType)));

            Assert.IsType <FooType>(handler.Payload);
            var fooType = handler.Payload as FooType;

            Assert.Equal("bar", fooType.Foo);

            Assert.True(pollableSource.Poll(handler, typeof(FooType)));

            Assert.IsType <FooType>(handler.Payload);
            fooType = handler.Payload as FooType;
            Assert.Equal("bar", fooType.Foo);
        }
Exemple #3
0
        public void TestErrorsNoRetry()
        {
            var searchDirectories            = GetSearchDirectories("TestBinder");
            IServiceProvider serviceProvider = CreateStreamsContainer(searchDirectories).BuildServiceProvider();
            var messageConverter             = serviceProvider.GetService <ISmartMessageConverter>();

            Assert.NotNull(messageConverter);

            var binder = serviceProvider.GetService <IBinder>() as AbstractPollableMessageSourceBinder;

            Assert.NotNull(binder);

            var configurer = serviceProvider.GetService <MessageConverterConfigurer>();

            Assert.NotNull(configurer);

            var pollableSource = new DefaultPollableMessageSource(serviceProvider.GetService <IApplicationContext>(), messageConverter);

            configurer.ConfigurePolledMessageSource(pollableSource, "foo");
            pollableSource.AddInterceptor(new TestSimpleChannelInterceptor());

            var properties = new ConsumerOptions()
            {
                MaxAttempts = 1
            };

            properties.PostProcess();

            var latch = new CountdownEvent(1);

            binder.BindConsumer("foo", "bar", pollableSource, properties);
            var errorChan        = serviceProvider.GetServices <IMessageChannel>().Where(chan => chan.ServiceName == IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME).Single() as ISubscribableChannel;
            var errorChanHandler = new TestErrorsErrorChannelHandler(latch);

            errorChan.Subscribe(errorChanHandler);

            var h1 = new TestFuncMessageHandler((m) =>
            {
                throw new Exception("test recoverer");
            });

            Assert.True(pollableSource.Poll(h1));
            Assert.Equal(1, h1.Count);
        }
Exemple #4
0
        public void TestRequeue()
        {
            var searchDirectories            = GetSearchDirectories("TestBinder");
            IServiceProvider serviceProvider = CreateStreamsContainer(searchDirectories).BuildServiceProvider();
            var messageConverter             = serviceProvider.GetService <ISmartMessageConverter>();

            Assert.NotNull(messageConverter);

            var binder = serviceProvider.GetService <IBinder>() as AbstractPollableMessageSourceBinder;

            Assert.NotNull(binder);

            var configurer = serviceProvider.GetService <MessageConverterConfigurer>();

            Assert.NotNull(configurer);

            var pollableSource = new DefaultPollableMessageSource(serviceProvider.GetService <IApplicationContext>(), messageConverter);

            configurer.ConfigurePolledMessageSource(pollableSource, "foo");

            var mockCallback = new Mock <IAcknowledgmentCallback>(MockBehavior.Default);

            pollableSource.AddInterceptor(new TestRequeueChannelInterceptor(mockCallback));
            var properties = new ConsumerOptions()
            {
                MaxAttempts            = 2,
                BackOffInitialInterval = 0
            };

            properties.PostProcess();

            binder.BindConsumer("foo", "bar", pollableSource, properties);
            var h1 = new TestFuncMessageHandler((m) =>
            {
                throw new RequeueCurrentMessageException("test retry");
            });

            Assert.True(pollableSource.Poll(h1));
            Assert.Equal(2, h1.Count);
            mockCallback.Verify((call) => call.Acknowledge(Status.REQUEUE));
        }
Exemple #5
0
        public void TestSimple()
        {
            var searchDirectories            = GetSearchDirectories("TestBinder");
            IServiceProvider serviceProvider = CreateStreamsContainer(searchDirectories).BuildServiceProvider();
            var messageConverter             = serviceProvider.GetService <ISmartMessageConverter>();

            Assert.NotNull(messageConverter);

            var binder = serviceProvider.GetService <IBinder>() as AbstractPollableMessageSourceBinder;

            Assert.NotNull(binder);

            var configurer = serviceProvider.GetService <MessageConverterConfigurer>();

            Assert.NotNull(configurer);

            var pollableSource = new DefaultPollableMessageSource(serviceProvider.GetService <IApplicationContext>(), messageConverter);

            configurer.ConfigurePolledMessageSource(pollableSource, "foo");
            pollableSource.AddInterceptor(new TestSimpleChannelInterceptor());

            var properties = new ConsumerOptions()
            {
                MaxAttempts            = 2,
                BackOffInitialInterval = 0
            };

            properties.PostProcess();

            binder.BindConsumer("foo", "bar", pollableSource, properties);
            var handler = new TestSimpleHandler();

            Assert.True(pollableSource.Poll(handler));

            Assert.Equal(2, handler.Count);
        }
 protected virtual void PostProcessPollableSource(DefaultPollableMessageSource bindingTarget)
 {
 }
Exemple #7
0
        public void TestErrors()
        {
            var searchDirectories            = GetSearchDirectories("TestBinder");
            IServiceProvider serviceProvider = CreateStreamsContainer(searchDirectories).BuildServiceProvider();
            var messageConverter             = serviceProvider.GetService <ISmartMessageConverter>();

            Assert.NotNull(messageConverter);

            var binder = serviceProvider.GetService <IBinder>() as AbstractPollableMessageSourceBinder;

            Assert.NotNull(binder);

            var configurer = serviceProvider.GetService <MessageConverterConfigurer>();

            Assert.NotNull(configurer);

            var pollableSource = new DefaultPollableMessageSource(serviceProvider.GetService <IApplicationContext>(), messageConverter);

            configurer.ConfigurePolledMessageSource(pollableSource, "foo");
            pollableSource.AddInterceptor(new TestSimpleChannelInterceptor());

            var properties = new ConsumerOptions()
            {
                MaxAttempts            = 2,
                BackOffInitialInterval = 0,
                RetryableExceptions    = new List <string>()
                {
                    "!System.InvalidOperationException"
                }
            };

            properties.PostProcess();

            var latch = new CountdownEvent(2);

            binder.BindConsumer("foo", "bar", pollableSource, properties);
            var errorChan        = serviceProvider.GetServices <IMessageChannel>().Where(chan => chan.ServiceName == IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME).Single() as ISubscribableChannel;
            var errorChanHandler = new TestErrorsErrorChannelHandler(latch);

            errorChan.Subscribe(errorChanHandler);

            var h1 = new TestFuncMessageHandler((m) =>
            {
                throw new Exception("test recoverer");
            });

            Assert.True(pollableSource.Poll(h1));
            Assert.Equal(2, h1.Count);

            var getter = binder.GetType().GetProperty("LastError").GetGetMethod();

            var lastError = getter.Invoke(binder, new object[0]) as IMessage;

            Assert.NotNull(lastError);

            var lastErrorMessage = ((Exception)lastError.Payload).InnerException.Message;

            Assert.Equal("test recoverer", lastErrorMessage);

            var h2 = new TestFuncMessageHandler((m) =>
            {
                throw new InvalidOperationException("no retries");
            });

            Assert.True(pollableSource.Poll(h2));
            Assert.Equal(1, h2.Count);

            lastError        = getter.Invoke(binder, new object[0]) as IMessage;
            lastErrorMessage = ((Exception)lastError.Payload).InnerException.Message;
            Assert.Equal("no retries", lastErrorMessage);
        }
Exemple #8
0
        public void TestEmbedded()
        {
            var searchDirectories            = GetSearchDirectories("TestBinder");
            IServiceProvider serviceProvider = CreateStreamsContainer(
                searchDirectories,
                "spring:cloud:stream:bindings:foo:consumer:headerMode=" + HeaderMode.EmbeddedHeaders.ToString()).BuildServiceProvider();
            var messageConverter = serviceProvider.GetService <ISmartMessageConverter>();

            Assert.NotNull(messageConverter);

            var binder = serviceProvider.GetService <IBinder>() as AbstractPollableMessageSourceBinder;

            Assert.NotNull(binder);

            var configurer = serviceProvider.GetService <MessageConverterConfigurer>();

            Assert.NotNull(configurer);

            var setter        = binder.GetType().GetProperty("MessageSourceDelegate").GetSetMethod();
            var messageSource = new TestFuncMessageSource(() =>
            {
                var original = new MessageValues(
                    Encoding.UTF8.GetBytes("foo"),
                    new Dictionary <string, object>()
                {
                    { MessageHeaders.CONTENT_TYPE, "application/octet-stream" }
                });
                var payload = new byte[0];
                try
                {
                    payload = EmbeddedHeaderUtils.EmbedHeaders(original, MessageHeaders.CONTENT_TYPE);
                }
                catch (Exception e)
                {
                    Assert.NotNull(e);
                }

                return(Message.Create <byte[]>(payload));
            });

            setter.Invoke(binder, new object[] { messageSource });

            var options = serviceProvider.GetService <IOptions <BindingServiceOptions> >();

            options.Value.Bindings.TryGetValue("foo", out var bindingOptions);
            Assert.Equal(HeaderMode.EmbeddedHeaders, bindingOptions.Consumer.HeaderMode);

            var pollableSource = new DefaultPollableMessageSource(serviceProvider.GetService <IApplicationContext>(), messageConverter);

            configurer.ConfigurePolledMessageSource(pollableSource, "foo");
            pollableSource.AddInterceptor(new TestEmbededChannelInterceptor());

            binder.BindConsumer("foo", "bar", pollableSource, bindingOptions.Consumer);

            var handler = new TestConvertSimpleHandler();

            Assert.True(pollableSource.Poll(handler));

            Assert.IsType <string>(handler.Payload);
            var str = handler.Payload as string;

            Assert.Equal("FOO", str);
            handler.Message.Headers.TryGetValue(MessageHeaders.CONTENT_TYPE, out var contentType);
            Assert.Equal("application/octet-stream", contentType.ToString());
        }