(python版)
# coding: utf-8
import pika
import os
import json
from kafka import KafkaProducer
from kafka.errors import KafkaError
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
class GetRabbitMq:
'''RabbitMq获取数据推送到kafka'''
def __init__(self,username,password,host,queueName, kafka_servers, kafkatopic):
self.kafka_servers = kafka_servers
self.kafkatopic = kafkatopic
self.username = username
self.password = password
self.host = host
self.queueName = queueName
self.connection = None
self.producer = None
try:
self.credentials = pika.PlainCredentials('admin','admin')
self.connection = pika.BlockingConnection(pika.ConnectionParameters('XXX.xxx.xxx.xxx',5672,'/',self.credentials))
self.channel = self.connection.channel()
self.channel.queue_declare(queue=self.queueName, durable=True)
self.producer = KafkaProducer(bootstrap_servers=self.kafka_servers)
except Exception, e:
print e
def sendjsondata(self, params):
try:
producer = self.producer
param = json.loads(params)
for key in param.keys():
if param.get(key) is None:
del param[key]
message = json.dumps(param)
print message
producer.send(self.kafkatopic,message)
producer.flush()
except Exception,e:
print e
def callback(self,ch, method,properties,body):
self.sendjsondata(body)
#反馈信息
ch.basic_ack(delivery_tag=method.delivery_tag)
if __name__ == "__main__":
#kafka集群
kafka_servers = ['xxxx.xxx.xx.xxx:9092']
# topic 名称
topic = 'test'
rabbitMqMessage = GetRabbitMq('admin','admin','XXX.XXX.XXX.XXX','queuename',kafka_servers,topic)
# True:收到消息会给rabbit反馈信息,且彻底消费消息,False,不给反馈,rabbit将消息标识为Unacked
rabbitMqMessage.channel.basic_consume(queue=rabbitMqMessage.queueName,on_message_callback=rabbitMqMessage.callback,exclusive=False)
rabbitMqMessage.channel.start_consuming()
(java版)
public class Rabbit2Kafka {
private static final String MY_TOPIC = "test";
private KafkaProducer<Integer, byte[]> producer;
public Rabbit2Kafka() throws IOException, TimeoutException {
super();
initKafkaProducer();
}
public static void main(String[] args) throws IOException, TimeoutException {
// TODO Auto-generated method stub
Rabbit2Kafka rabbit2Kafka = new Rabbit2Kafka();
rabbit2Kafka.mqReceiver();
}
/*
*链接rabbitmq,并且接受其中的数据。
*/
public void mqReceiver() throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("1.1.1.1");
factory.setPort(5672);
factory.setUsername("admin");
factory.setPassword("admin");
Connection connection = factory.newConnection();
//获得信道
Channel channel = connection.createChannel();
channel.exchangeDeclare("chinalife.interf.prplmsgsend.msgsend.queue","direct",true);
//channel.queueDeclare("chinalife.interf.prplmsgsend.msgsend.queue", false, true, true, null);
//channel.queueBind("chinalife.interf.prplmsgsend.msgsend.queue","chinalife.interf.prplmsgsend.msgsend.queue","prplmsgsend");
if (channel != null && channel.isOpen() ==true) {
System.out.println("------channel .isOpen() : "+ channel.isOpen() );
}
MyConsumer myConsumer = new MyConsumer(channel);
channel.basicConsume("chinalife.interf.prplmsgsend.msgsend.queue", false, myConsumer);
}
class MyConsumer extends DefaultConsumer {
public MyConsumer(Channel channel) {
super(channel);
}
@Override
public void handleDelivery(String consumerTag, Envelope envelope,
AMQP.BasicProperties properties, byte[] body)
throws IOException {
if (body.length > 0) {
ProducerRecord<Integer,byte[] > producerRecord = new ProducerRecord<Integer, byte[]>(MY_TOPIC, body);
producer.send(producerRecord, new Callback() {
public void onCompletion(RecordMetadata recordMetadata, Exception e) {
if (e != null) {
e.printStackTrace();
} else {
System.out.println("offset : " + recordMetadata.offset());
}
}
});
String str = new String(producerRecord.value(),"UTF-8");
System.out.println("producer :"+str);
}
}
}
public void initKafkaProducer() {
Properties props = new Properties();
props.put("bootstrap.servers", "1.1.1.111:9092");
props.put("acks", "0");
props.put("retries", "0");
props.put("key.serializer", "org.apache.kafka.common.serialization.IntegerSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.ByteArraySerializer");
//生产者实例
producer = new KafkaProducer<Integer, byte[]>(props);
if (producer != null) {
System.out.println("----------------producer has estiblished!!");
}else {
System.out.println("producer error");
}
}
}
每行代码意思请看前几篇文章。