/* (c) 2017 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.notification.support;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.geoserver.notification.common.CustomSaslConfig;
import org.geotools.util.logging.Logging;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
public class Receiver {
protected static Logger LOGGER = Logging.getLogger(Receiver.class);
private static String BROKER_URI = "amqp://localhost:4432";
private final static String QUEUE_NAME = "jms/queue";
private ReceiverService service;
private Connection connection;
private Channel channel;
public Receiver() {
}
public Receiver(String username, String password) {
if (username != null && !username.isEmpty() && password != null && !password.isEmpty()) {
BROKER_URI = "amqp://" + username + ":" + password + "@localhost:4432";
}
}
public void receive(ReceiverService service) throws Exception {
// let's setup evrything and start listening
this.service = service;
ConnectionFactory factory = createConnectionFactory();
factory.setSaslConfig(new CustomSaslConfig());
connection = factory.newConnection();
channel = connection.createChannel();
channel.exchangeDeclare("testExchange", "fanout");
channel.queueDeclare(QUEUE_NAME, false, true, false, null);
channel.queueBind(QUEUE_NAME, "testExchange", "testRouting");
channel.basicConsume(QUEUE_NAME, true, newConsumer(channel));
}
protected ConnectionFactory createConnectionFactory() throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setAutomaticRecoveryEnabled(false);
factory.setUri(BROKER_URI);
return factory;
}
private DefaultConsumer newConsumer(Channel channel) {
return new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope,
AMQP.BasicProperties properties, byte[] body) throws IOException {
service.manage(body);
}
};
}
public void close() {
if (channel != null) {
try {
channel.close();
} catch (Exception e) {
LOGGER.log(Level.FINER, e.getMessage(), e);
}
}
if (connection != null) {
try {
connection.close();
} catch (Exception e) {
LOGGER.log(Level.FINER, e.getMessage(), e);
}
}
}
}