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:
进入安装目录
启动之后,会出现一个黑窗口
这时候就可以访问mq的默认端口8161(61616是客户端调用端口)
使用默认的账号密码: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();
}
}
在代码执行后可以看到,里面有一个myqueue队列,并且有信息入列和出列,说明我们的操作成功了.
(简单的演练一下)
kafka:
启动虚拟机,并进入以安装好的kafka目录(先启动了Zookeeper)
进入安装目录后,启动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
可以看到在虚拟机环境可以正常的生产和消费订阅,接下来测试一些本地通过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();
}
}
}
}
可以正常的消费
接下来,通过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的形式,将连接访问参数拼接起来,然后进行解析.
查看管理界面,可以看到数据已经被转到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
(未完待续…)