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); }
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); }
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); }
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)); }
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) { }
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); }
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()); }