Camel-学习笔记(一)

本文介绍如何使用Apache Camel实现从kafka到mq的数据转换流程,涵盖CamelContext、Component、Processor、Route等核心概念,并提供具体代码实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Camel(一)

初识camel

第一次遇到camel是在公司里面使用的一个架构中体现的,用的是古老的servermix,ESB架构,比起当下特别火热的微服务架构,显得优点龙钟老态,但是里面很多知识,在有闲暇之余的条件下,是很值得学习和借鉴的.

说回camel,在我看来,它不像是一个可以独立运行的工具,更像是一个辅助型的光环英雄,自己没有任何输出能力,它的路由转换功能,是它最大的亮点,通过高度的抽象,让不同的数据源,可以通过同一份api,进行路由的转换,其中整合绝大多数市面上已有的协议,所以,掌握它,就像掌握了"seigai"

本章只实现一个简单的转换(无处理)

kafka->camel->mq

Camel 本身无法运行,需要作为一个处理工具配合其它组件使用

组件

Camel Context:Camel 的上下文,里面管理程序中所有的路由,和一些其它的属性

Component:作为被路由Route所引用的组件,它通过一个工厂类,封装和添加了一个组件,并提供一个组件标签来引用;

Processor:是一个数据处理器,用来定义数据处理逻辑的.可以在路由转换的时候调用

Route:路由,定义了数据在一个程序中的传输路径。(from.processer.(数据接收类).to)

Endpoint:结束点,可以作为Route的结束点或者起点 Endpoint作为Camel系统中一个通道的端点,可以发送或者接收消息。在Camel中Endpoint通过URI来配置,在运行时Camel来查找端点,端点的功能强大全面且可维护

Message: Message 接口提供了一个对单个消息的抽象,这些消息可以是一个请求,回复或者是一个异常

QS

kafka-camel-mq

从kafka消费数据,然后将数据转到mq队列中

准备:kafka环境,mq环境

kafka使用安装在虚拟机里面,mq安装在本地,(模拟不同域的数据转换)

mq:

进入安装目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BTXHVpZe-1592747006009)(camel.assets/1592742142533.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GakoLoFT-1592747006013)(camel.assets/1592742172667.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O46MyRLs-1592747006015)(camel.assets/1592742185222.png)]

启动之后,会出现一个黑窗口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NbNGBLa9-1592747006018)(camel.assets/1592742206886.png)]

这时候就可以访问mq的默认端口8161(61616是客户端调用端口)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GmTbtFIl-1592747006020)(camel.assets/1592742266592.png)]

使用默认的账号密码:admin就可以进入管理页面

测试用java操作mq

mq支持JMS,具有两种消息形式,一种是queues,一种是生产消费模式

public class demo {
    public static void main(String[] args) throws JMSException, InterruptedException {

        //获取工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
        Connection connection = activeMQConnectionFactory.createConnection();

        connection.start();

        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        Queue myqueue = session.createQueue("myqueue");


        //消费者
        MessageConsumer consumer = session.createConsumer(myqueue);
        consumer.setMessageListener(new MessageListener() {
            public void onMessage(Message message) {
                if (message instanceof TextMessage) {
                    TextMessage message1 = (TextMessage) message;
                    String text = null;
                    try {
                        text = message1.getText();
                        System.out.println(text);
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        
        MessageProducer producer = session.createProducer(myqueue);
        producer.send(session.createTextMessage("mymessage"));


        Thread.sleep(100000000l);
        producer.close();
        connection.close();
        session.close();
        connection.close();


    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RXgWIhIj-1592747006021)(camel.assets/1592742577954.png)]

在代码执行后可以看到,里面有一个myqueue队列,并且有信息入列和出列,说明我们的操作成功了.

(简单的演练一下)

kafka:

启动虚拟机,并进入以安装好的kafka目录(先启动了Zookeeper)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GffK4dVr-1592747006022)(camel.assets/1592742963478.png)]

进入安装目录后,启动kafka

另起一个窗口,测试生产消费是否正常

bin/kafka-console-producer.sh --topic test --broker-list node02:9092
bin/kafka-console-consumer.sh --topic test --bootstrap-server node02:9092 --new-consumer

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C3j5C4K3-1592747006025)(camel.assets/1592743824510.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RjnUnAa7-1592747006026)(camel.assets/1592743833178.png)]

可以看到在虚拟机环境可以正常的生产和消费订阅,接下来测试一些本地通过java,消费虚拟机的kafka,是否成功

public class KafkaConsumer1 {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "node01:9092,node02:9092,node03:9092");
        props.put("group.id", "ccc");
        props.put("enable.auto.commit", "false"); //取消自动提交offset
        props.put("auto.commit.interval.ms", "1000");
        props.put("session.timeout.ms", "30000");
        props.put("auto.offset.reset", "earliest");
//以下两行代码 ---消费者自动提交offset值 props.put("enable.auto.commit", "true"); props.put("auto.commit.interval.ms",  "1000");
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<String, String>(props);
        kafkaConsumer.subscribe(Arrays.asList("test"));
        int i =0;
        while (true)
        {

            ConsumerRecords<String, String> poll = kafkaConsumer.poll(100);
            for (ConsumerRecord<String, String> s : poll)
            {
                long offset = s.offset();
                String value = s.value();
                i++;
                System.out.println("第"+i+"条记录的offset为:"+offset+"内容为:"+value);
                kafkaConsumer.commitSync();
            }
        }

    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GnZR3pwY-1592747006027)(camel.assets/1592743921942.png)]

可以正常的消费

接下来,通过camel,进行简单的整合

一个典型的Camel应用按照下面几个步骤进行:
1.创建一个CamelContext对象
2.向CamelContext对象中添加Endpoints和Components
3.向CamelContext对象中添加route规则(本次不做任何处理,直接将数据从kafka,转到mq)
4.调用CamelContext对象的start()方法
5.调用CamelContext对象的stop()方法

public class Camel_kafka_01 {
    public static void main(String[] args) throws Exception {

        //创建一个CamelContext对象
        CamelContext camelContext = new DefaultCamelContext();

        通过调用mq提供的客户端连接端口61616进行连接
        ConnectionFactory connectionfactory =
                new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616");

        //添加组件标签
        camelContext.addComponent("activemq", JmsComponent.jmsComponentAutoAcknowledge(connectionfactory));

        //定义路由规则
        camelContext.addRoutes(new RouteBuilder() {
            public void configure() {
                from("kafka:test?brokers=node02:9092"
                        + "&maxPollRecords=5000"
                        + "&consumersCount=1"
                        + "&seekTo=beginning"
                        + "&groupId=kafkagroup")
                        .routeId("myKafka")
                        .to("activemq:queue:testQueue");
            }
        });

        //启动线程
        camelContext.start();

        Thread.sleep(5 * 60 * 1000);
        //关闭线程
        camelContext.stop();
    }
}

camel主要用uri的形式,将连接访问参数拼接起来,然后进行解析.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ne1IKvbD-1592747006030)(camel.assets/1592746421080.png)]

查看管理界面,可以看到数据已经被转到mq

除了kafka-mq,还有很多其它的转换组件

这有点像jdbc,将很多数据源进行了高度抽象,然后用同一套,或者指定的api进行操作,这对企业中的工作交接,维护都是很有价值的.

后面会对camel的一些组件进行研究和补充

有兴趣的可以访问官网学习:https://camel.apache.org/components/latest/index.html

(未完待续…)

待补充

理界面,可以看到数据已经被转到mq

除了kafka-mq,还有很多其它的转换组件

这有点像jdbc,将很多数据源进行了高度抽象,然后用同一套,或者指定的api进行操作,这对企业中的工作交接,维护都是很有价值的.

后面会对camel的一些组件进行研究和补充
Camel-学习笔记(二)关于camel-file的使用案例

有兴趣的可以访问官网学习:https://camel.apache.org/components/latest/index.html

(未完待续…)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值