Spring Cloud Stream @SendTo Аннотация не работает - PullRequest
0 голосов
/ 10 января 2019

Я использую Spring Cloud Stream с Spring Boot. Мое приложение очень простое:

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 = локальный

Сценарии

1) Когда я помещаю сообщение в очередь 'test_input.test_group', сообщение правильно печатается и корректно отправляется в обмен 'test_output'. Поэтому ExampleService :: dequeue работает хорошо.

2) Когда я вызываю метод ExampleService :: queue (из-за пределов класса, в тесте), сообщение никогда не отправляется в обмен 'test_output'.

Я работаю с Spring Boot 2.0.6.RELEASE и Spring Cloud Stream 2.0.2.RELEASE.

Кто-нибудь знает, почему сценарий 2) не работает? Заранее спасибо.

1 Ответ

0 голосов
/ 10 января 2019

Что заставляет вас верить, что @SendTo само по себе поддерживается? @SendTo - это вторичная аннотация, используемая многими проектами, а не только Spring Cloud Stream; насколько я знаю, нет ничего, что будет искать его самостоятельно.

Вместо этого попробуйте аннотацию @Publisher Spring Integration (с @EnablePublisher).

EDIT

Чтобы форсировать прокси с помощью CGLIB вместо JDK-прокси, вы можете сделать это ...

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