java学习

本文描述了一个大学生利用Java构建的应用,通过RabbitMQ接收消息,实现并发处理并记录日志。文章详细介绍了项目的步骤,包括创建Maven项目、配置RabbitMQ、使用线程池处理消息、I/O操作以及集成日志系统。
摘要由CSDN通过智能技术生成

今天是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结束编写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值