Kafka_producer

本文介绍了一种通过Java实现的日志数据实时收集方法,并将其发送至Kafka Topic的技术方案。该方案利用Producer对象发送数据,通过Reader对象读取文件末尾的数据行,实现了循环周期性的数据读取及发送。

1、将日志数据收集并发送到Kafka topic中(循环周期CEL\Time)


    //创建producer对象
    Properties props = new Properties();
    props.put("metadata.broker.list", "node1:9092,node2:9092,node3:9092");//属性设置
    props.put("serializer.class", "kafka.serializer.StringEncoder"); //属性设置
    props.put("request.required.acks", "1");//属性设置

    ProducerConfig config = new ProducerConfig(props);
    Producer<String, String> producer = new Producer<String, String>(config);

    //创建reader对象  reader 对象中自己封装了1、读取最后一行 2、将数据存入一维数组 3、日期转换 等方法
    Reader reader = new Reader();
    double[] rtData;
    String rtmsg;

    while (true) {
        long time = System.currentTimeMillis();
        for (String tagName : tags) {
            rtData = reader.getrtdata(tagName, DataPath);
            rtmsg = tagName + " " + rtData[0] + " " + rtData[1] + " " + rtData[2] + " " + rtData[3] + " " + rtData[4] + " " + rtData[5];
            String ip = "";
            try {
                ip = InetAddress.getLocalHost().getHostAddress();
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            KeyedMessage<String, String> data = new KeyedMessage<String, String>("test2", ip, rtmsg);//数据格式
            producer.send(data);发送到topic
        }
        long _long = System.currentTimeMillis()-time;
        System.out.println(_long);
        Utils.sleep(CEL\Time-_long);
    }
import os import shutil import threading from loguru import logger from app import constants from app.base_models.models import ElementKafkaMsgs, KafkaProdType from app.bean.kafka_producer import OperationKafkaProducer from app.schedule.workers.base_worker import BaseWorker from app.service.adapter_service import AdapterService class SendKafkaMsgWorker(BaseWorker): _instance_lock = threading.Lock() _instance = None _kafka_producers = {} def __init__(self, running_tasks=None, input_q=None, output_q=None): super().__init__(running_tasks, input_q, output_q) self.running_tasks = running_tasks with self._instance_lock: if self._instance is None: self._instance = self def before(self): self._kafka_producers = { KafkaProdType.OPERATION: OperationKafkaProducer() } def get_producer(self, producer_type): return self._kafka_producers.get(producer_type) def parse(self, data: ElementKafkaMsgs): data_name, uuid_temp = data.data_name_and_uuid try: for msg in data.kafka_msgs: producer = self.get_producer(msg.producer) if not producer: logger.error(f"kafka producer error {msg.producer}") continue producer.send(topic=msg.topic, value=msg.data, key=msg.key) self.running_tasks.remove((data.task_ids, data_name, data.task.assign_time)) AdapterService.delete_tasks(data.task.ids) except Exception as err: logger.error(f"failed to send kafka msg: {err.__class__.__name__}. error info: {err}") finally: temp_dir_global = os.path.join(constants.TMP_PATH, f"{data_name}_{uuid_temp}") if os.path.exists(temp_dir_global): shutil.rmtree(temp_dir_global) return None 请帮忙给一个测试用例,不能用的可以mock掉
最新发布
08-13
为了测试 `SendKafkaMsgWorker` 类的功能,我们可以编写一个基于 `unittest` 的测试用例。在这个测试中,我们会 mock 掉不能运行的部分,例如 Kafka 发送、日志记录、文件操作等。以下是测试用例的示例代码: ```python import unittest from unittest.mock import MagicMock, patch, Mock from app.bean.kafka_producer import OperationKafkaProducer from app.schedule.workers.send_kafka_msg_worker import SendKafkaMsgWorker from app.base_models.models import ElementKafkaMsgs, KafkaProdType class TestSendKafkaMsgWorker(unittest.TestCase): def setUp(self): self.running_tasks = set() self.input_q = Mock() self.output_q = Mock() self.worker = SendKafkaMsgWorker(self.running_tasks, self.input_q, self.output_q) # Mock KafkaProducer 的 send 方法 self.mock_producer = MagicMock(spec=OperationKafkaProducer) self.worker.get_producer = Mock(return_value=self.mock_producer) @patch("os.path.exists", return_value=True) @patch("shutil.rmtree", return_value=None) def test_parse_success(self, mock_rmtree, mock_exists): # 准备测试数据 kafka_msgs = [ Mock(topic="test_topic", value="test_value", key="test_key", producer=KafkaProdType.OPERATION) ] data_name_and_uuid = ("test_data", "12345") task = Mock() task.ids = ["task_1"] task.assign_time = "2023-01-01T00:00:00" element_kafka_msgs = Mock(spec=ElementKafkaMsgs) element_kafka_msgs.kafka_msgs = kafka_msgs element_kafka_msgs.data_name_and_uuid = data_name_and_uuid element_kafka_msgs.task = task element_kafka_msgs.task_ids = "task_1" # 执行测试 result = self.worker.parse(element_kafka_msgs) # 验证结果 self.mock_producer.send.assert_called_once_with(topic="test_topic", value="test_value", key="test_key") self.assertEqual(self.running_tasks, set()) # running_tasks 应该被移除 self.assertIsNone(result) # 返回值应为 None @patch("os.path.exists", return_value=False) def test_parse_kafka_send_failure(self, mock_exists): # 模拟 KafkaProducer 不存在 self.worker.get_producer = Mock(return_value=None) # 准备测试数据 kafka_msgs = [ Mock(topic="test_topic", value="test_value", key="test_key", producer="invalid_producer") ] data_name_and_uuid = ("test_data", "12345") task = Mock() task.ids = ["task_1"] task.assign_time = "2023-01-01T00:00:00" element_kafka_msgs = Mock(spec=ElementKafkaMsgs) element_kafka_msgs.kafka_msgs = kafka_msgs element_kafka_msgs.data_name_and_uuid = data_name_and_uuid element_kafka_msgs.task = task element_kafka_msgs.task_ids = "task_1" # 执行测试 result = self.worker.parse(element_kafka_msgs) # 验证结果 self.assertIsNone(result) # 返回值应为 None @patch("os.path.exists", return_value=True) @patch("shutil.rmtree", side_effect=Exception("Mocked rmtree error")) def test_parse_exception_in_finally(self, mock_rmtree, mock_exists): # 准备测试数据 kafka_msgs = [ Mock(topic="test_topic", value="test_value", key="test_key", producer=KafkaProdType.OPERATION) ] data_name_and_uuid = ("test_data", "12345") task = Mock() task.ids = ["task_1"] task.assign_time = "2023-01-01T00:00:00" element_kafka_msgs = Mock(spec=ElementKafkaMsgs) element_kafka_msgs.kafka_msgs = kafka_msgs element_kafka_msgs.data_name_and_uuid = data_name_and_uuid element_kafka_msgs.task = task element_kafka_msgs.task_ids = "task_1" # 执行测试 result = self.worker.parse(element_kafka_msgs) # 验证结果 self.mock_producer.send.assert_called_once_with(topic="test_topic", value="test_value", key="test_key") self.assertEqual(self.running_tasks, set()) # running_tasks 应该被移除 self.assertIsNone(result) # 返回值应为 None if __name__ == '__main__': unittest.main() ``` ### 测试说明: 1. **`setUp` 方法**: - 初始化 `SendKafkaMsgWorker` 实例,并模拟 `get_producer` 方法,返回一个 mock 的 Kafka Producer。 2. **`test_parse_success` 测试**: - 验证在正常情况下,`parse` 方法是否正确地调用 Kafka Producer 的 `send` 方法。 - 验证是否成功从 `running_tasks` 中移除任务。 - 验证是否调用 `shutil.rmtree` 删除临时目录。 3. **`test_parse_kafka_send_failure` 测试**: - 模拟 Kafka Producer 不存在的情况,验证是否记录错误日志。 4. **`test_parse_exception_in_finally` 测试**: - 模拟 `finally` 块中 `shutil.rmtree` 抛出异常,验证是否仍然正常处理任务。 --- ### 依赖说明: - 使用 `unittest` 框架。 - 使用 `unittest.mock` 中的 `MagicMock`, `patch`, `Mock` 来模拟外部依赖。 - 假设 `KafkaProdType.OPERATION` 是一个合法的 Producer 类型,并且 `OperationKafkaProducer` 的 `send` 方法可用。 --- ### 如何运行: 将此测试文件保存为 `test_send_kafka_msg_worker.py`,然后运行: ```bash python -m unittest test_send_kafka_msg_worker.py ``` --- ### 提示: - 如果你的项目中使用了其他日志记录器(如 `loguru`),可以使用 `patch("loguru.logger.error")` 来验证日志是否被正确记录。 - 如果 `AdapterService.delete_tasks` 也需要测试,可以继续 mock 并验证其调用情况。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值