/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.nutch.publisher.rabbitmq;
import java.lang.invoke.MethodHandles;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.util.StringUtils;
import org.apache.nutch.publisher.NutchPublisher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class RabbitMQPublisherImpl implements NutchPublisher{
private static String EXCHANGE_SERVER;
private static String EXCHANGE_TYPE;
private static String HOST;
private static int PORT;
private static String VIRTUAL_HOST;
private static String USERNAME;
private static String PASSWORD;
private static String QUEUE_NAME;
private static boolean QUEUE_DURABLE;
private static String QUEUE_ROUTING_KEY;
private static final Logger LOG = LoggerFactory
.getLogger(MethodHandles.lookup().lookupClass());
private static Channel channel;
@Override
public boolean setConfig(Configuration conf) {
try {
EXCHANGE_SERVER = conf.get("rabbitmq.exchange.server", "fetcher_log");
EXCHANGE_TYPE = conf.get("rabbitmq.exchange.type", "fanout");
HOST = conf.get("rabbitmq.host", "localhost");
PORT = conf.getInt("rabbitmq.port", 5672);
VIRTUAL_HOST = conf.get("rabbitmq.virtualhost", null);
USERNAME = conf.get("rabbitmq.username", null);
PASSWORD = conf.get("rabbitmq.password", null);
QUEUE_NAME = conf.get("rabbitmq.queue.name", "fanout.queue");
QUEUE_DURABLE = conf.getBoolean("rabbitmq.queue.durable", true);
QUEUE_ROUTING_KEY = conf.get("rabbitmq.queue.routingkey", "fanout.key");
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(HOST);
factory.setPort(PORT);
if(VIRTUAL_HOST != null) {
factory.setVirtualHost(VIRTUAL_HOST);
}
if(USERNAME != null) {
factory.setUsername(USERNAME);
factory.setPassword(PASSWORD);
}
Connection connection = factory.newConnection();
channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_SERVER, EXCHANGE_TYPE);
channel.queueDeclare(QUEUE_NAME, QUEUE_DURABLE, false, false, null);
channel.queueBind(QUEUE_NAME, EXCHANGE_SERVER, QUEUE_ROUTING_KEY);
LOG.info("Configured RabbitMQ publisher");
return true;
}catch(Exception e) {
LOG.error("Could not initialize RabbitMQ publisher - {}", StringUtils.stringifyException(e));
return false;
}
}
@Override
public void publish(Object event, Configuration conf) {
try {
channel.basicPublish(EXCHANGE_SERVER, QUEUE_ROUTING_KEY, null, getJSONString(event).getBytes());
} catch (Exception e) {
LOG.error("Error occured while publishing - {}", StringUtils.stringifyException(e));
}
}
private String getJSONString(Object obj) {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
LOG.error("Error converting event object to JSON String - {}", StringUtils.stringifyException(e));
}
return null;
}
@Override
public void setConf(Configuration arg0) {
}
@Override
public Configuration getConf() {
return null;
}
}