spring cloud stream kafka
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-kafka</artifactId>
</dependency>
自定义管道
import org.springframework.cloud.stream.annotation.Input;
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.SubscribableChannel;
import org.springframework.stereotype.Component;
@Component
public interface MyProcessor {
String MESSAGE_INPUT = "log_input";
String MESSAGE_OUTPUT = "log_output";
String LOG_FORMAT_INPUT = "log_format_input";
String LOG_FORMAT_OUTPUT = "log_format_output";
@Input(MESSAGE_INPUT)
SubscribableChannel logInput();
@Output(MESSAGE_OUTPUT)
MessageChannel logOutput();
@Input(LOG_FORMAT_INPUT)
SubscribableChannel logFormatInput();
@Output(LOG_FORMAT_OUTPUT)
MessageChannel logFormatOutput();
}
发送,需要绑定@EnableBinding(MyProcessor.class)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.messaging.support.MessageBuilder;
@EnableBinding(MyProcessor.class)
public class SendService {
@Autowired
private MyProcessor source;
public void sendMsg(String msg) {
source.logOutput().send(MessageBuilder.withPayload(msg).build());
}
public void sendFormatMsg(String msg) {
source.logFormatOutput().send(MessageBuilder.withPayload(msg).build());
}
}
接收,receive方法在接收到消息后,可以直接通过@SendTo 转发到其他的消息队列中
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.messaging.handler.annotation.SendTo;
@EnableBinding(MyProcessor.class)
@Slf4j
public class ReceiveListener {
@StreamListener(value = MyProcessor.MESSAGE_INPUT)
@SendTo(value = MyProcessor.LOG_FORMAT_OUTPUT)
public String receive(String payload) {
log.info("接收到的信息:" + payload);
String result="格式化的消息:"+payload;
return result;
}
@StreamListener(value = MyProcessor.LOG_FORMAT_INPUT)
public void receiveFormat(String payload) {
log.info("接收到的信息:" + payload);
}
}
绑定了2个kafka,注意要指定默认的绑定器default-binder,不然启动报错
spring:
cloud:
stream:
default-binder: kafka1
bindings:
#与@StreamListener注解中的value一致,是绑定的渠道名
log_input:
binder: kafka1
#绑定的kafka topic名称为test
destination: topicOne
#消费组
# group: cloud-test2-group1
# content-type: application/json
log_format_input:
binder: kafka2
#绑定的kafka topic名称为test
destination: topicTwo
#消费组
# group: cloud-test2-group1
# content-type: application/json
log_output:
binder: kafka1
destination: topicOne
# content-type: application/json
log_format_output:
binder: kafka2
destination: topicTwo
binders:
kafka1:
type: kafka
environment:
spring:
cloud:
stream:
kafka:
binder:
brokers: localhost:9092
zkNodes: localhost:2181
kafka2:
type: kafka
environment:
spring:
cloud:
stream:
kafka:
binder:
brokers: localhost:9093
zkNodes: localhost:2182