Spring Cloud Stream @SendTo Annotation not working

时间:2019-01-09 22:18:08

标签: spring spring-boot spring-cloud spring-cloud-stream

I'm using Spring Cloud Stream with Spring Boot. My application is very simple:

ExampleService.class:

@EnableBinding(Processor1.class)
@Service
public class ExampleService {

    @StreamListener(Processor1.INPUT)
    @SendTo(Processor1.OUTPUT)
    public String dequeue(String message){
        System.out.println("New message: " + message);
        return message;
    }

    @SendTo(Processor1.OUTPUT)
    public String queue(String message){
        return message;
    }
}

Procesor1.class:

public interface Processor1 {

    String INPUT = "input1";
    String OUTPUT = "output1";

    @Input(Processor1.INPUT)
    SubscribableChannel input1();

    @Output(Processor1.OUTPUT)
    MessageChannel output1();
}

application.properties:

spring.cloud.stream.bindings.input1.destination=test_input
spring.cloud.stream.bindings.input1.group=test_group
spring.cloud.stream.bindings.input1.binder=binder1

spring.cloud.stream.bindings.output1.destination=test_output
spring.cloud.stream.bindings.output1.binder=binder1

spring.cloud.stream.binders.binder1.type=rabbit

spring.cloud.stream.binders.binder1.environment.spring.rabbitmq.host=localhost

Scenarios:

1) When I push a message in 'test_input.test_group' queue, message is correctly printed and correctly sent to 'test_output' exchange. So ExampleService::dequeue works well.

2) When I invoke ExampleService::queue method (from outside the class, in a test), message is never sent to 'test_output' exchange.

I'm working with Spring Boot 2.0.6.RELEASE and Spring Cloud Stream 2.0.2.RELEASE.

Anybody knows why scenario 2) is not working? Thanks in advance.

1 个答案:

答案 0 :(得分:3)

是什么使您相信@SendTo本身受支持? @SendTo是许多项目使用的辅助注释,而不仅仅是Spring Cloud Stream;据我所知,没有什么可以自己寻找的。

改为尝试Spring Integration的@Publisher注释(使用@EnablePublisher)。

编辑

要强制使用CGLIB而不是JDK代理进行代理,您可以执行此操作...

@Bean
public static BeanFactoryPostProcessor bfpp() {
    return bf -> {
        bf.getBean(IntegrationContextUtils.PUBLISHER_ANNOTATION_POSTPROCESSOR_NAME,
                PublisherAnnotationBeanPostProcessor.class).setProxyTargetClass(true);
    };
}