我的第一个java 项目(半成品)

我的第一个java 项目(半成品)

这是一个小说项目,地址 github, 只有很少的接口,

以前有过nestjs 的开发记录,spring boot 的形式和nestjs差不多。controller, server, entity,这3层基本上就可以进行增删改查了。不过java的语法比较来说还是繁琐的。 光一个ArrayList 添加数据要一直new 对象,不能直接添加。

这个项目主要是学习spring boot 的基本用法和中间件的基本用法,redis, rabbitmq,es搜索。 都只做了简单的增加和查找, 其实我使用了ai来提需求和设计实现。 Ai 写的很详细, 容错重试什么的都有写上去, 不过目前对我来说实在是太复杂了。后面的话可能进行继续完善。

这篇文章就主要记录一下基础知识:

ElasticSearch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Configuration
public class EsConfiguration {
@Value("${elasticsearch.host}")
private String host;

@Value("${elasticsearch.port}")
private int port;


@Bean
public ElasticsearchClient elasticsearchClient() {
RestClient restClient = RestClient.builder(
new HttpHost(host, port, "http")
).build();

RestClientTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
return new ElasticsearchClient(transport);
}
}

es 保存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 保存到es 
public void saveToEs(NovelChapterEntity entity) {
try {
ChapterESDoc doc = new ChapterESDoc();
doc.setAuthorId(entity.getAuthorId());
doc.setId(entity.getId());
doc.setTitle(entity.getTitle());
doc.setContent(entity.getContent());

esClient.index( i -> i
.index("chapter")
.id(entity.getId().toString())
.document(doc)
);
} catch (Exception e) {

}

}

es 查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public List<ChapterESDoc> searchChapterKeyword(String key) throws IOException {
SearchResponse<ChapterESDoc> searchResponse = esClient.search(
s -> s
.index("chapter")
.query(q -> q
.multiMatch(m -> m
.fields("title", "content")
.query(key))),
ChapterESDoc.class);

return searchResponse.hits().hits()
.stream()
.map(Hit::source)
.collect(Collectors.toList());

}

rabbitmq

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
@Configuration
public class RabbitConfiguration {
public static final String EMAIL_QUEUE = "ppnovel-email.queue";
public static final String EMAIL_EXCHANGE = "ppnovel-email.exchange";
public static final String EMAIL_ROUTING_KEY = "ppnovel-email.send";

public static final String CHAPTER_AUDIT_QUEUE = "ppnovel-chapter-audit.queue";
public static final String CHAPTER_AUDIT_EXCHANGE = "ppnovel-chapter-audit.exchange";
public static final String CHAPTER_AUDIT_ROUTING_KEY = "ppnovel-chapter-audit.send";

@Bean
public Queue emailQueue() {
return new Queue(EMAIL_QUEUE, true);
}

@Bean
public DirectExchange emailExchange() {
return new DirectExchange(EMAIL_EXCHANGE);
}

@Bean
public Binding emailBinding() {
return BindingBuilder
.bind(emailQueue())
.to(emailExchange())
.with(EMAIL_ROUTING_KEY);
}

@Bean
public Queue chapterAuditQueue() {
return new Queue(CHAPTER_AUDIT_QUEUE, true);
}

@Bean
public DirectExchange chapterAuditExchange() {
return new DirectExchange(CHAPTER_AUDIT_EXCHANGE);
}

@Bean
public Binding chapterAuditBinding() {
return BindingBuilder
.bind(chapterAuditQueue())
.to(chapterAuditExchange())
.with(CHAPTER_AUDIT_ROUTING_KEY);
}

@Bean
public MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}

@Bean
public RabbitTemplate rabbitTemplate(
ConnectionFactory connectionFactory,
MessageConverter messageConverter) {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setMessageConverter(messageConverter);
return template;
}
}

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@RabbitListener(queues = RabbitConfiguration.EMAIL_QUEUE)
public void handleEmail(EmailMessage msg, Channel channel, Message mqMessage) throws IOException {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(mailFrom);
message.setTo(msg.getTo());
message.setSubject(msg.getSubject());
message.setText(msg.getContent());
try {


javaMailSender.send(message);
channel.basicAck(
mqMessage.getMessageProperties().getDeliveryTag(),
false
);
log.info("邮件发送成功: {}", msg.getTo());

} catch (MailSendException e) {
// 临时失败,重试
channel.basicNack(
mqMessage.getMessageProperties().getDeliveryTag(),
false,
true
);
} catch (Exception e) {
// 不可恢复错误,丢弃或死信
channel.basicReject(
mqMessage.getMessageProperties().getDeliveryTag(),
false
);
}
}