我在Spring Boot中使用Spring Cloud Stream。我的申请很简单:
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)无法正常工作吗?提前致谢。
是什么使您认为@SendTo自己受支持?@SendTo是许多项目使用的辅助注释,而不仅仅是Spring Cloud Stream;据我所知,没有什么可以自己寻找的。
@SendTo
尝试使用Spring Integration的@Publisher注释(带有@EnablePublisher)。
@Publisher
@EnablePublisher
编辑
要强制使用CGLIB而不是JDK代理进行代理,您可以执行此操作…
@Bean public static BeanFactoryPostProcessor bfpp() { return bf -> { bf.getBean(IntegrationContextUtils.PUBLISHER_ANNOTATION_POSTPROCESSOR_NAME, PublisherAnnotationBeanPostProcessor.class).setProxyTargetClass(true); }; }