/* (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.common.sender; import java.io.IOException; import java.io.Serializable; import java.util.logging.Level; import java.util.logging.Logger; import org.geoserver.notification.common.CustomSaslConfig; import org.geoserver.notification.common.NotificationXStreamDefaultInitializer; import org.geotools.util.logging.Logging; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.thoughtworks.xstream.XStream; /** * Initialize the AMQP broker client connection and delegate to specific RabbitMQ client implementation the dispatch of payload. * <p> * The broker connection parameters are populated by {@link XStream} deserialization, using the configuration provided by * {@link NotificationXStreamDefaultInitializer} * <p> * Anonymous connection is possible using {@link CustomSaslConfig} * * @param host the host to which the underlying TCP connection is made * @param port the port number to which the underlying TCP connection is made * @param virtualHost a path which acts as a namespace (optional) * @param username if present is used for SASL exchange (optional) * @param password if present is used for SASL exchange (optional) * @author Xandros * @see FanoutRabbitMQSender */ public abstract class RabbitMQSender implements NotificationSender, Serializable { private static Logger LOGGER = Logging.getLogger(RabbitMQSender.class); private static final long serialVersionUID = 1370640635300148935L; protected String host; protected String virtualHost; protected int port; protected String username; protected String password; protected String uri; protected Connection conn; protected Channel channel; public void initialize() throws Exception { if (uri == null) { if (this.username != null && !this.username.isEmpty() && this.password != null && !this.password.isEmpty()) { this.uri = "amqp://" + this.username + ":" + this.password + "@" + this.host + ":" + this.port; } else { this.uri = "amqp://" + this.host + ":" + this.port; } } ConnectionFactory factory = new ConnectionFactory(); factory.setUri(this.uri); String vHost = (this.virtualHost != null && !this.virtualHost.isEmpty() ? this.virtualHost : "/"); factory.setVirtualHost(vHost); factory.setSaslConfig(new CustomSaslConfig()); conn = factory.newConnection(); channel = conn.createChannel(); } public void close() throws Exception { if (this.channel != null) { this.channel.close(); } if (this.conn != null) { this.conn.close(); } } // Prepare Connection Channel public void send(byte[] payload) throws Exception { try { this.initialize(); this.sendMessage(payload); } catch (Exception e) { LOGGER.log(Level.SEVERE, e.getMessage(), e); e.printStackTrace(); } finally { this.close(); } } // Send message to the Queue by using Channel public abstract void sendMessage(byte[] payload) throws IOException; }