RabbitMq消费数据后推往kafka代码学习

(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");
        }


    }

}

每行代码意思请看前几篇文章。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值