java我的第一个java 项目(半成品)
aelax我的第一个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
| 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 ); } }
|