本文介绍了Spring Kafka的Spring Boot Rest API的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我已经设计了一个Spring Boot REST API ADD和GET方法
I have designed a Spring boot REST API ADD and GET method
@RestController("ProductV1Controller")
public class ProductController
{
private final IProductProducer _productProducer;
public ProductController(IProductProducer productProducer) {
_productProducer = productProducer;}
@PostMapping()
void AddProduct(@Valid @RequestBody ProductViewModel product) {
_productProducer.AddProduct(product);
}
@GetMapping()
List<ProductViewModel> Products() {
var test = _productProducer.GetProducts();
return _productProducer.GetProducts();
}
}
服务层
@Service
public class ProductProducer implements IProductProducer{
private final KafkaTemplate<String, Object> _template;
public ProductProducer(KafkaTemplate<String, Object> _template) {
this._template = _template;
}
@Override
public List<ProductViewModel> GetProducts() {
this._template.send(ProductTopicConstants.GET_PRODUCTS,null);
return List.of(new ProductViewModel("","",0,"")); --> Need to return the value from the kafka
}
@Override
public void AddProduct(ProductViewModel product) {
this._template.send(ProductTopicConstants.ADD_PRODUCT, product);
}
}
Kafka监听器
@KafkaListener(id = ProductTopicConstants.GET_PRODUCTS, topics = ProductTopicConstants.GET_PRODUCTS)
public List<Product> GetProducts() {
return _productRepository.findAll();
}
在服务层 GetProducts()
中,我需要返回来自 _productRepository.findAll();
In the service layer GetProducts()
I need to return the list of the project that is coming from the _productRepository.findAll();
使用Spring kafka进行REST API的最佳方法是什么.
What is the best approach to do the REST API with Spring kafka.
推荐答案
您需要使用 ReplyingKafkaTemplate
将结果返回给其余控制器.
You need to use a ReplyingKafkaTemplate
to return a result to the rest controller.
请参见 ReplyingKafkaTemplate .
文档中有一个示例.
编辑
@SpringBootApplication
@RestController
public class So63058608Application {
private static final Logger LOG = LoggerFactory.getLogger(So63058608Application.class);
public static void main(String[] args) {
SpringApplication.run(So63058608Application.class, args);
}
@Autowired
private ReplyingKafkaTemplate<String, String, List<String>> replyTemplate;
@GetMapping(path = "/get")
public List<String> getThem() throws Exception {
RequestReplyFuture<String, String, List<String>> future =
this.replyTemplate.sendAndReceive(new ProducerRecord<>("so63058608-1", 0, null, null));
LOG.info(future.getSendFuture().get(10, TimeUnit.SECONDS).getRecordMetadata().toString());
return future.get(10, TimeUnit.SECONDS).value();
}
@KafkaListener(id = "so63058608-1", topics = "so63058608-1", splitIterables = false)
@SendTo
public List<String> returnList(@Payload(required = false) String payload) {
return new ArrayList<>(List.of("foo", "bar", "baz"));
}
@Bean
public ReplyingKafkaTemplate<String, String, List<String>> replyer(ProducerFactory<String, String> pf,
ConcurrentKafkaListenerContainerFactory<String, List<String>> containerFactory) {
containerFactory.setReplyTemplate(kafkaTemplate(pf));
ConcurrentMessageListenerContainer<String, List<String>> container = replyContainer(containerFactory);
ReplyingKafkaTemplate<String, String, List<String>> replyer = new ReplyingKafkaTemplate<>(pf, container);
return replyer;
}
@Bean
public ConcurrentMessageListenerContainer<String, List<String>> replyContainer(
ConcurrentKafkaListenerContainerFactory<String, List<String>> containerFactory) {
ConcurrentMessageListenerContainer<String, List<String>> container =
containerFactory.createContainer("so63058608-2");
container.getContainerProperties().setGroupId("so63058608-2");
container.setBatchErrorHandler(new BatchLoggingErrorHandler());
return container;
}
@Bean
public KafkaTemplate<String, String> kafkaTemplate(ProducerFactory<String, String> pf) {
return new KafkaTemplate<>(pf);
}
@Bean
public NewTopic topic1() {
return TopicBuilder.name("so63058608-1").partitions(1).replicas(1).build();
}
@Bean
public NewTopic topic3() {
return TopicBuilder.name("so63058608-2").partitions(1).replicas(1).build();
}
}
spring.kafka.consumer.key-deserializer=org.springframework.kafka.support.serializer.JsonDeserializer
spring.kafka.consumer.value-deserializer=org.springframework.kafka.support.serializer.JsonDeserializer
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.properties.spring.json.trusted.packages=*
spring.kafka.producer.key-serializer=org.springframework.kafka.support.serializer.JsonSerializer
spring.kafka.producer.value-serializer=org.springframework.kafka.support.serializer.JsonSerializer
$ curl localhost:8080/get
["foo","bar","baz"]
EDIT2
并返回一些对象的列表...
And with a list of some object returned...
@SpringBootApplication
@RestController
public class So63058608Application {
private static final Logger LOG = LoggerFactory.getLogger(So63058608Application.class);
public static void main(String[] args) {
SpringApplication.run(So63058608Application.class, args);
}
@Autowired
private ReplyingKafkaTemplate<String, String, List<Foo>> replyTemplate;
@GetMapping(path = "/get")
public List<Foo> getThem() throws Exception {
RequestReplyFuture<String, String, List<Foo>> future =
this.replyTemplate.sendAndReceive(new ProducerRecord<>("so63058608-1", 0, null, null));
LOG.info(future.getSendFuture().get(10, TimeUnit.SECONDS).getRecordMetadata().toString());
List<Foo> result = future.get(10, TimeUnit.SECONDS).value();
LOG.info(result.toString());
return result;
}
@KafkaListener(id = "so63058608-1", topics = "so63058608-1", splitIterables = false)
@SendTo
public List<Foo> returnList(@Payload(required = false) String payload) {
return new ArrayList<>(List.of(new Foo("foo"), new Foo("bar"), new Foo("baz")));
}
@Bean
public ReplyingKafkaTemplate<String, String, List<Foo>> replyer(ProducerFactory<String, String> pf,
ConcurrentKafkaListenerContainerFactory<String, List<Foo>> containerFactory) {
containerFactory.setReplyTemplate(kafkaTemplate(pf));
ConcurrentMessageListenerContainer<String, List<Foo>> container = replyContainer(containerFactory);
ReplyingKafkaTemplate<String, String, List<Foo>> replyer = new ReplyingKafkaTemplate<>(pf, container);
return replyer;
}
@Bean
public ConcurrentMessageListenerContainer<String, List<Foo>> replyContainer(
ConcurrentKafkaListenerContainerFactory<String, List<Foo>> containerFactory) {
ConcurrentMessageListenerContainer<String, List<Foo>> container =
containerFactory.createContainer("so63058608-2");
container.getContainerProperties().setGroupId("so63058608-2");
container.setBatchErrorHandler(new BatchLoggingErrorHandler());
return container;
}
@Bean
public KafkaTemplate<String, String> kafkaTemplate(ProducerFactory<String, String> pf) {
return new KafkaTemplate<>(pf);
}
@Bean
public NewTopic topic1() {
return TopicBuilder.name("so63058608-1").partitions(1).replicas(1).build();
}
@Bean
public NewTopic topic3() {
return TopicBuilder.name("so63058608-2").partitions(1).replicas(1).build();
}
public static JavaType returnType(byte[] data, Headers headers) {
return TypeFactory.defaultInstance()
.constructCollectionLikeType(List.class, Foo.class);
}
}
class Foo {
private String bar;
public Foo() {
}
public Foo(String bar) {
this.bar = bar;
}
public String getBar() {
return this.bar;
}
public void setBar(String bar) {
this.bar = bar;
}
@Override
public String toString() {
return "Foo [bar=" + this.bar + "]";
}
}
spring.kafka.consumer.properties.spring.json.value.type.method=com.example.demo.So63058608Application.returnType
[Foo [bar=foo], Foo [bar=bar], Foo [bar=baz]]
这篇关于Spring Kafka的Spring Boot Rest API的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!