今天是2023.12.2 19.30,因为已经大三上了,感觉需要记录一下自己代码的学习情况,从今天开始吧。
通过前面一段时间的基础了解,然后开始自己想一个项目把知识综合起来。
目标: 构建一个基于Java的应用程序,该应用程序使用RabbitMQ接收消息,通过并发方式处理这些消息,并将处理结果记录到日志中。
项目步骤: 步骤1:创建Maven项目 在IDE中创建一个新的Maven项目。 在pom.xml文件中添加必要的依赖,如RabbitMQ客户端、SLF4J和Logback。 步骤2:配置RabbitMQ 创建一个RabbitMQ队列用于接收消息。 配置RabbitMQ连接工厂,以连接到本地RabbitMQ实例。 步骤3:并发消息处理 创建一个线程池来处理并发任务。 实现一个消费者,它将从RabbitMQ队列中接收消息,并使用线程池进行处理。 步骤4:实现I/O操作 定义一个方法,用于处理接收到的消息(例如,解析、转换或其他操作)。 将处理结果写入到文件中,以演示I/O操作。 步骤5:集成日志系统 使用SLF4J和Logback为应用程序配置日志。 在关键操作中添加日志记录,如消息接收、处理和错误处理。 步骤6:测试和调试(未完成) 编写单元测试以确保代码的正确性。 运行应用程序并监控RabbitMQ队列和日志输出,以确保一切正常工作。
src ├── main │ ├── java │ │ ├── Main.java │ │ ├── MessageProcessor.java │ │ └──RabbitMQConsumer.java │ └── resources │ └── logback.xml └── test └── java └── MessageProcessorTest.java
步骤一:
在idea界面创建了meavn项目。
步骤二:
安装rabbitmq的步骤省略。
首先在xml文件中加入rabbitmq的配置。
<!-- RabbitMQ 客户端依赖 -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.12.0</version>
</dependency>
接下来进行消费者和生产者代码的实现
生产者:
进行日志对象的创建
private static final Logger logger = LoggerFactory.getLogger(MessageProcessor.class);
先进行工厂的建立,设置rabbitmq服务器是本地主机。
ConnectionFactory factory1 = new ConnectionFactory();
factory1.setHost("localhost");
首先使用try catch抓取中断异常,然后再try里面进行for循环(我这里是因为使用for循环进行消息的生成,当测试了)。
然后for循环中使用try catch语句进行异常的抓取,在try中实现生产者和rabbitmq服务器连接,,同时在生产者和rrabbitmq中间建立通道。
接着就是交换机、文本数据处理、把消息传递到rabbitmq服务器中。
同时在代码中进行logger的记录。
try {
for (int i = 1; i <= 10; i++) {
try (Connection connection = factory1.newConnection();
Channel channel1 = connection.createChannel();) {
channel1.exchangeDeclare("1", "direct");
LocalDateTime currentDateTime = LocalDateTime.now();
Thread.sleep(20);
String message1 = i + ": hello,world.Now is " + currentDateTime;
channel1.basicPublish("1", "qu1_", null, message1.getBytes());
System.out.println(message1);
}catch (IOException | TimeoutException e) {// 捕获和处理 RabbitMQ 连接或通道的异常
logger.error("RabbitMQ 操作失败", e);
}
}
}catch(InterruptedException e){ // 捕获和处理中断异常
logger.error("线程被中断", e);
}
logger.info("主程序执行结束");
现在生产者就写完了,接下来开始消费者。
消费者:
同样先进行工厂的建立,设置rabbitmq服务器是本地主机。
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
接着就是消息队列的声明创建(因为自己刚刚开始接触项目,命名还是比较粗糙,等我慢慢开始使用比较系统的变量命名)
Connection connection = factory.newConnection();
Channel channel1 = connection.createChannel();
channel1.exchangeDeclare("1","direct");
channel1.queueDeclare("qu1",false,false,false,null);
channel1.queueBind("qu1","1","qu1_");
进行线程池的创建,因为需要并发处理嘛,就用线程池了。
ExecutorService threadPool = Executors.newFixedThreadPool(10); // 创建线程池
开始消息回调函数的定义,在消息回调函数中定义线程的具体步骤。可以看见线程是先进行消息的解析,然后打印消息,然后写入文本。
// 定义消息的回调函数
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
Runnable task = () ->{
String message = null; // 将消息内容转换为UTF-8编码
try {
message = new String(delivery.getBody(), "UTF-8");
} catch (UnsupportedEncodingException e) {
logger.error("不支持的解码",e);
}
System.out.println(" [x] Received Info '" + message + "'"); // 打印接收到的消息
try(BufferedWriter fl1 = new BufferedWriter(new FileWriter("temp.txt",true))){
fl1.write(message + System.lineSeparator());
}catch(IOException e){
logger.error("文本写入信息失败",e);
e.printStackTrace();
}
};
threadPool.submit(task);
};
最后消费消息,然后进行日志的记录。
channel1.basicConsume("qu1", true, deliverCallback, consumerTag -> {}); // 开始消费消息
logger.info("主程序执行结束");
接下来的步骤三、四,都在其中完成了。
步骤五:
在logger里面进行日志格式的设定
<configuration>
<!-- Console appender -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- File appender -->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>D:/begin/后端/java/study/project_1/src/main/resources/temp.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- Log everything at INFO level or higher to the console and the file -->
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
这是日志的输出,输出在设定的文本中。
2023-12-01 20:30:22 [main] INFO temp - 开始操作
2023-12-01 20:30:43 [main] INFO temp - 开始操作
2023-12-02 15:11:22 [main] INFO MessageProcessor - 主程序执行结束
2023-12-02 15:13:39 [main] INFO RabbitMQConsumer - 主程序运行结束
2023-12-02 15:14:03 [main] INFO MessageProcessor - 主程序执行结束
2023-12-02 15:15:22 [main] INFO MessageProcessor - 主程序执行结束
2023-12-02 15:15:28 [main] INFO RabbitMQConsumer - 主程序执行结束
步骤六还未完成,因为不知道怎么进行测试代码的编写,先放着,后面再看看。
2023.12.2 20.04结束编写