Search in sources :

Example 1 with ProducerProperties

use of org.springframework.cloud.stream.binder.ProducerProperties in project spring-cloud-stream by spring-cloud.

the class BindingServiceTests method checkDynamicBinding.

@SuppressWarnings({ "rawtypes", "unchecked" })
@Test
public void checkDynamicBinding() {
    BindingServiceProperties properties = new BindingServiceProperties();
    BindingProperties bindingProperties = new BindingProperties();
    bindingProperties.setProducer(new ProducerProperties());
    properties.setBindings(Collections.singletonMap("foo", bindingProperties));
    DefaultBinderFactory binderFactory = createMockBinderFactory();
    final ExtendedPropertiesBinder binder = mock(ExtendedPropertiesBinder.class);
    Properties extendedProps = new Properties();
    when(binder.getExtendedProducerProperties(anyString())).thenReturn(extendedProps);
    Binding<MessageChannel> mockBinding = Mockito.mock(Binding.class);
    final AtomicReference<MessageChannel> dynamic = new AtomicReference<>();
    when(binder.bindProducer(matches("foo"), any(DirectChannel.class), any(ProducerProperties.class))).thenReturn(mockBinding);
    BindingService bindingService = new BindingService(properties, binderFactory) {

        @Override
        protected <T> Binder<T, ?, ?> getBinder(String channelName, Class<T> bindableType) {
            return binder;
        }
    };
    SubscribableChannelBindingTargetFactory bindableSubscribableChannelFactory = new SubscribableChannelBindingTargetFactory(new MessageConverterConfigurer(properties, new CompositeMessageConverterFactory()));
    final AtomicBoolean callbackInvoked = new AtomicBoolean();
    BinderAwareChannelResolver resolver = new BinderAwareChannelResolver(bindingService, bindableSubscribableChannelFactory, new DynamicDestinationsBindable(), (name, channel, props, extended) -> {
        callbackInvoked.set(true);
        assertThat(name).isEqualTo("foo");
        assertThat(channel).isNotNull();
        assertThat(props).isNotNull();
        assertThat(extended).isSameAs(extendedProps);
        props.setUseNativeEncoding(true);
        extendedProps.setProperty("bar", "baz");
    });
    ConfigurableListableBeanFactory beanFactory = mock(ConfigurableListableBeanFactory.class);
    when(beanFactory.getBean("foo", MessageChannel.class)).thenThrow(new NoSuchBeanDefinitionException(MessageChannel.class));
    when(beanFactory.getBean("bar", MessageChannel.class)).thenThrow(new NoSuchBeanDefinitionException(MessageChannel.class));
    doAnswer(new Answer<Void>() {

        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {
            dynamic.set(invocation.getArgument(1));
            return null;
        }
    }).when(beanFactory).registerSingleton(eq("foo"), any(MessageChannel.class));
    doAnswer(new Answer<Object>() {

        @Override
        public Object answer(InvocationOnMock invocation) throws Throwable {
            return dynamic.get();
        }
    }).when(beanFactory).initializeBean(any(MessageChannel.class), eq("foo"));
    resolver.setBeanFactory(beanFactory);
    MessageChannel resolved = resolver.resolveDestination("foo");
    assertThat(resolved).isSameAs(dynamic.get());
    ArgumentCaptor<ProducerProperties> captor = ArgumentCaptor.forClass(ProducerProperties.class);
    verify(binder).bindProducer(eq("foo"), eq(dynamic.get()), captor.capture());
    assertThat(captor.getValue().isUseNativeEncoding()).isTrue();
    assertThat(captor.getValue()).isInstanceOf(ExtendedProducerProperties.class);
    assertThat(((ExtendedProducerProperties) captor.getValue()).getExtension()).isSameAs(extendedProps);
    doReturn(dynamic.get()).when(beanFactory).getBean("foo", MessageChannel.class);
    properties.setDynamicDestinations(new String[] { "foo" });
    resolved = resolver.resolveDestination("foo");
    assertThat(resolved).isSameAs(dynamic.get());
    properties.setDynamicDestinations(new String[] { "test" });
    try {
        resolved = resolver.resolveDestination("bar");
        fail();
    } catch (DestinationResolutionException e) {
        assertThat(e).hasMessageContaining("Failed to find MessageChannel bean with name 'bar'");
    }
}
Also used : ProducerProperties(org.springframework.cloud.stream.binder.ProducerProperties) ExtendedProducerProperties(org.springframework.cloud.stream.binder.ExtendedProducerProperties) DirectChannel(org.springframework.integration.channel.DirectChannel) BindingProperties(org.springframework.cloud.stream.config.BindingProperties) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) ProducerProperties(org.springframework.cloud.stream.binder.ProducerProperties) ConsumerProperties(org.springframework.cloud.stream.binder.ConsumerProperties) BindingProperties(org.springframework.cloud.stream.config.BindingProperties) BindingServiceProperties(org.springframework.cloud.stream.config.BindingServiceProperties) ExtendedProducerProperties(org.springframework.cloud.stream.binder.ExtendedProducerProperties) Properties(java.util.Properties) AtomicReference(java.util.concurrent.atomic.AtomicReference) DefaultBinderFactory(org.springframework.cloud.stream.binder.DefaultBinderFactory) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) MessageChannel(org.springframework.messaging.MessageChannel) InvocationOnMock(org.mockito.invocation.InvocationOnMock) DestinationResolutionException(org.springframework.messaging.core.DestinationResolutionException) BindingServiceProperties(org.springframework.cloud.stream.config.BindingServiceProperties) ExtendedPropertiesBinder(org.springframework.cloud.stream.binder.ExtendedPropertiesBinder) CompositeMessageConverterFactory(org.springframework.cloud.stream.converter.CompositeMessageConverterFactory) NoSuchBeanDefinitionException(org.springframework.beans.factory.NoSuchBeanDefinitionException) ConfigurableListableBeanFactory(org.springframework.beans.factory.config.ConfigurableListableBeanFactory) ExtendedProducerProperties(org.springframework.cloud.stream.binder.ExtendedProducerProperties) Test(org.junit.Test)

Example 2 with ProducerProperties

use of org.springframework.cloud.stream.binder.ProducerProperties in project spring-cloud-stream by spring-cloud.

the class BindingServiceProperties method getProducerProperties.

public ProducerProperties getProducerProperties(String outputBindingName) {
    Assert.notNull(outputBindingName, "The output binding name cannot be null");
    BindingProperties bindingProperties = getBindingProperties(outputBindingName);
    ProducerProperties producerProperties = bindingProperties.getProducer();
    if (producerProperties == null) {
        producerProperties = new ProducerProperties();
        bindingProperties.setProducer(producerProperties);
    }
    return producerProperties;
}
Also used : ProducerProperties(org.springframework.cloud.stream.binder.ProducerProperties)

Example 3 with ProducerProperties

use of org.springframework.cloud.stream.binder.ProducerProperties in project spring-cloud-stream by spring-cloud.

the class BinderAwareChannelResolver method resolveDestination.

@SuppressWarnings("unchecked")
@Override
public MessageChannel resolveDestination(String channelName) {
    try {
        return super.resolveDestination(channelName);
    } catch (DestinationResolutionException e) {
    // intentionally empty; will check again while holding the monitor
    }
    synchronized (this) {
        BindingServiceProperties bindingServiceProperties = this.bindingService.getBindingServiceProperties();
        String[] dynamicDestinations = bindingServiceProperties.getDynamicDestinations();
        boolean dynamicAllowed = ObjectUtils.isEmpty(dynamicDestinations) || ObjectUtils.containsElement(dynamicDestinations, channelName);
        try {
            return super.resolveDestination(channelName);
        } catch (DestinationResolutionException e) {
            if (!dynamicAllowed) {
                throw e;
            }
        }
        MessageChannel channel = this.bindingTargetFactory.createOutput(channelName);
        this.beanFactory.registerSingleton(channelName, channel);
        this.instrumentChannelWithGlobalInterceptors(channel, channelName);
        channel = (MessageChannel) this.beanFactory.initializeBean(channel, channelName);
        if (this.newBindingCallback != null) {
            ProducerProperties producerProperties = bindingServiceProperties.getProducerProperties(channelName);
            Object extendedProducerProperties = this.bindingService.getExtendedProducerProperties(channel, channelName);
            this.newBindingCallback.configure(channelName, channel, producerProperties, extendedProducerProperties);
            bindingServiceProperties.updateProducerProperties(channelName, producerProperties);
        }
        Binding<MessageChannel> binding = this.bindingService.bindProducer(channel, channelName);
        this.dynamicDestinationsBindable.addOutputBinding(channelName, binding);
        return channel;
    }
}
Also used : ProducerProperties(org.springframework.cloud.stream.binder.ProducerProperties) MessageChannel(org.springframework.messaging.MessageChannel) DestinationResolutionException(org.springframework.messaging.core.DestinationResolutionException) BindingServiceProperties(org.springframework.cloud.stream.config.BindingServiceProperties)

Example 4 with ProducerProperties

use of org.springframework.cloud.stream.binder.ProducerProperties in project spring-cloud-stream by spring-cloud.

the class MessageConverterConfigurer method configureMessageChannel.

/**
 * Setup data-type and message converters for the given message channel.
 *
 * @param channel message channel to set the data-type and message converters
 * @param channelName the channel name
 * @param inbound inbound (i.e., "input") or outbound channel
 */
private void configureMessageChannel(MessageChannel channel, String channelName, boolean inbound) {
    Assert.isAssignable(AbstractMessageChannel.class, channel.getClass());
    AbstractMessageChannel messageChannel = (AbstractMessageChannel) channel;
    BindingProperties bindingProperties = this.bindingServiceProperties.getBindingProperties(channelName);
    String contentType = bindingProperties.getContentType();
    ProducerProperties producerProperties = bindingProperties.getProducer();
    if (!inbound && producerProperties != null && producerProperties.isPartitioned()) {
        messageChannel.addInterceptor(new PartitioningInterceptor(bindingProperties, getPartitionKeyExtractorStrategy(producerProperties), getPartitionSelectorStrategy(producerProperties)));
    }
    ConsumerProperties consumerProperties = bindingProperties.getConsumer();
    if (this.isNativeEncodingNotSet(producerProperties, consumerProperties, inbound)) {
        if (inbound) {
            messageChannel.addInterceptor(new InboundContentTypeEnhancingInterceptor(contentType));
        } else {
            messageChannel.addInterceptor(new OutboundContentTypeConvertingInterceptor(contentType, this.compositeMessageConverterFactory.getMessageConverterForAllRegistered()));
        }
    }
}
Also used : ProducerProperties(org.springframework.cloud.stream.binder.ProducerProperties) AbstractMessageChannel(org.springframework.integration.channel.AbstractMessageChannel) BindingProperties(org.springframework.cloud.stream.config.BindingProperties) ConsumerProperties(org.springframework.cloud.stream.binder.ConsumerProperties)

Example 5 with ProducerProperties

use of org.springframework.cloud.stream.binder.ProducerProperties in project spring-cloud-consul by spring-cloud.

the class TestProducer method run.

@Override
public void run(ApplicationArguments args) throws Exception {
    /*if (args.containsOption("partitioned")
				&& Boolean.valueOf(args.getOptionValues("partitioned").get(0))) {
			binder.setPartitionSelector(stubPartitionSelectorStrategy());
		}*/
    SubscribableChannel producerChannel = producerChannel();
    ProducerProperties properties = new ProducerProperties();
    properties.setPartitionKeyExpression(new SpelExpressionParser().parseExpression("payload"));
    binder.bindProducer(ConsulBinderTests.BINDING_NAME, producerChannel, properties);
    Message<String> message = new GenericMessage<>(ConsulBinderTests.MESSAGE_PAYLOAD);
    logger.info("Writing message to binder {}", binder);
    producerChannel.send(message);
}
Also used : GenericMessage(org.springframework.messaging.support.GenericMessage) ProducerProperties(org.springframework.cloud.stream.binder.ProducerProperties) SpelExpressionParser(org.springframework.expression.spel.standard.SpelExpressionParser) SubscribableChannel(org.springframework.messaging.SubscribableChannel) ExecutorSubscribableChannel(org.springframework.messaging.support.ExecutorSubscribableChannel)

Aggregations

ProducerProperties (org.springframework.cloud.stream.binder.ProducerProperties)7 ExtendedProducerProperties (org.springframework.cloud.stream.binder.ExtendedProducerProperties)3 BindingProperties (org.springframework.cloud.stream.config.BindingProperties)3 BindingServiceProperties (org.springframework.cloud.stream.config.BindingServiceProperties)3 MessageChannel (org.springframework.messaging.MessageChannel)3 Test (org.junit.Test)2 ArgumentMatchers.anyString (org.mockito.ArgumentMatchers.anyString)2 ConsumerProperties (org.springframework.cloud.stream.binder.ConsumerProperties)2 DefaultBinderFactory (org.springframework.cloud.stream.binder.DefaultBinderFactory)2 ExtendedPropertiesBinder (org.springframework.cloud.stream.binder.ExtendedPropertiesBinder)2 DirectChannel (org.springframework.integration.channel.DirectChannel)2 DestinationResolutionException (org.springframework.messaging.core.DestinationResolutionException)2 HashMap (java.util.HashMap)1 Properties (java.util.Properties)1 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)1 AtomicReference (java.util.concurrent.atomic.AtomicReference)1 InvocationOnMock (org.mockito.invocation.InvocationOnMock)1 NoSuchBeanDefinitionException (org.springframework.beans.factory.NoSuchBeanDefinitionException)1 ConfigurableListableBeanFactory (org.springframework.beans.factory.config.ConfigurableListableBeanFactory)1 Binder (org.springframework.cloud.stream.binder.Binder)1