依赖
// rocketmq
compile 'com.alibaba.cloud:spring-cloud-starter-stream-rocketmq:2.1.2.RELEASE'
compile 'org.springframework.cloud:spring-cloud-stream'
// javax.el
compile ('org.glassfish.web:javax.el:2.2.4') {
exclude group: 'javax.el', module: 'javax.el-api'
}
生产者
spring.cloud.stream.bindings.test-broadcast-topic.destination = test_broadcast_topic
spring.cloud.stream.rocketmq.bindings.test-broadcast-topic.producer.sync = true
spring.cloud.stream.bindings.test-broadcast-topic.content-type = application/json
消费者
spring.cloud.stream.bindings.test-broadcast-topic.destination = test_broadcast_topic
spring.cloud.stream.bindings.test-broadcast-topic.content-type = application/json
spring.cloud.stream.bindings.test-broadcast-topic.group=test
spring.cloud.stream.rocketmq.bindings.test-broadcast-topic.consumer.enabled = true
spring.cloud.stream.rocketmq.bindings.test-broadcast-topic.consumer.broadcasting = true
import com.mature.foundation.constant.Constant;
import com.mature.foundation.context.RequestContext;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;
import javax.inject.Inject;
@Component
@RequiredArgsConstructor(onConstructor_ = {@Inject})
@Slf4j
@EnableBinding({TestSource.class})
public class TestManager extends BaseManager {
private final TestSource testSource;
public void publishMessage(String msg) {
Message<String> message = MessageBuilder.withPayload(msg)
.setHeader(Constant.REQUEST_ID, RequestContext.getRequestId())
.setHeader(Constant.SPAN_ID, RequestContext.getSpanId())
.build();
boolean sendResult = testSource.test().send(message);
log.info("send result: {}", sendResult);
}
}
public interface TestSource {
@Output("test-broadcast-topic")
MessageChannel test();
}
生产者发起
public class Test extends BaseTest {
@Resource
private TestManager testManager;
@Test
public void test() throws Exception {
testManager.publishMessage("hahsh");
}
}
消费者代码
启动类:这里不加就要在handler上加
@EnableBinding({
TestSink.class
})
public interface TestSink {
@Input("test-broadcast-topic")
SubscribableChannel testTopic();
}
@Slf4j
@Component
@EnableBinding(TestSink.class)
@RequiredArgsConstructor(onConstructor_ = {@Inject})
public class TestHandler {
@StreamListener("test-broadcast-topic")
public void handleTest(@Payload String payload) {
log.info("接收test任务通知: {}", JsonUtil.toJsonString(payload));
}
}
stream 消息驱动,约定大于配置,只要生产者和消费者的信道,也就是@input() 和@output()里面的值和exchange一致,其实不用配置文件中写。