4) Consumer Group (CG):这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个topic可以有多个CG。topic的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个partion只会把消息发给该CG中的一个consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还可以将consumer进行自由的分组而不需要多次发送消息到不同的topic;
@Component
public class SimpleListener {
@KafkaListener(topics = {"topic1", "topic2"})
public void listen1(String data) {
System.out.println(data);
}
}
消息发送主要是使用KafkaTemplate,它具有多个方法可以发送消息,这里我们用简单的。
@RestController
@AllArgsConstructor
public class SimpleController {
private final KafkaTemplate
我们用postman测试一下,看看控制台有没有输出,有没有接受到消息。
4、发送实体类封装的消息
4.1实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Bar {
private Integer id;
private Integer age;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Foo {
private Integer id;
private String name;
}
4.2 配置文件
@Configuration
public class KafkaConfig {
@Bean
public ConcurrentKafkaListenerContainerFactory, ?> kafkaListenerContainerFactory(
ConcurrentKafkaListenerContainerFactoryConfigurer configurer,
ConsumerFactory
@RestController
@AllArgsConstructor
public class Example2Controller {
private final KafkaTemplate kafkaTemplate;
@PostMapping("/foo")
public void send(Foo foo){
kafkaTemplate.send("foo", "modelOne", foo);
}
@PostMapping("/bar")
public void send(Bar bar){
kafkaTemplate.send("bar", bar);
}
}
4.5结果
5、消息发送的同步方法和异步方法
方法
@Service
@AllArgsConstructor
public class SendService {
private final KafkaTemplate template;
// 异步
public void sendAnsyc(final Bar bar) {
// ProducerRecord producerRecord = new ProducerRecord<>("ansyc", bar);
ListenableFuture> future = template.send("ansyc",bar);
future.addCallback(new ListenableFutureCallback>() {
@Override
public void onSuccess(SendResult result) {
System.out.println("发送消息成功:" + result);
}
@Override
public void onFailure(Throwable ex) {
System.out.println("发送消息失败:"+ ex.getMessage());
}
});
}
// 同步
public void sendSync(final Bar bar) {
ProducerRecord producerRecord = new ProducerRecord<>("sync", bar);
try {
template.send(producerRecord).get(10, TimeUnit.SECONDS);
System.out.println("发送成功");
}
catch (ExecutionException e) {
System.out.println("发送消息失败:"+ e.getMessage());
}
catch (TimeoutException | InterruptedException e) {
System.out.println("发送消息失败:"+ e.getMessage());
}
}
}
监听器
@Component
public class Example3Listenter {
@KafkaListener(topics = "ansyc")
public void listenAnsyc(Bar bar) {
System.out.println(bar);
}
@KafkaListener(topics = "sync")
public void listenSync(Bar bar) {
System.out.println(bar);
}
}
Controller
@RestController
@AllArgsConstructor
public class Example3Controller {
private final SendService sendService;
@PostMapping("/ansyc")
public void sendAnsyc(Bar bar){
sendService.sendAnsyc(bar);
}
@PostMapping("/sync")
public void sendSync(Bar bar){
sendService.sendSync(bar);
}
}
异步结果 同步结果
6、使用事务的消息发送方式
在4.3application.yml中的properties配置上方添加这样的一句配置即可
transaction-id-prefix: tx.
代码
@RestController
@AllArgsConstructor
public class Example1Controller {
private final KafkaTemplate kafkaTemplate;
@PostMapping("/send/foo")
public void sendFoo(Foo foo) {
kafkaTemplate.executeInTransaction(kafkaTemplate -> {
kafkaTemplate.send("foo", foo);
return true;
});
}
}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml&q
Mockito单元测试实例:
public class SettingServiceTest {
private List<PersonDTO> personList = new ArrayList<PersonDTO>();
@InjectMocks
private SettingPojoService settin
public class DeleteExtraSpace {
/**
* 题目:给定字符串,删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。
* 方法1.用已有的String类的trim和replaceAll方法
* 方法2.全部用正则表达式,这个我不熟
* 方法3.“重新发明轮子”,从头遍历一次
*/
public static v
今天早上打开MyEclipse时,自动关闭!弹出An error has occurred.See the log file错误提示!
很郁闷昨天启动和关闭还好着!!!打开几次依然报此错误,确定不是眼花了!
打开日志文件!找到当日错误文件内容:
--------------------------------------------------------------------------