/**
*
*/
package vnet.sms.gateway.server.framework.internal.jmsbridge;
import static org.apache.commons.lang.Validate.notNull;
import java.io.Serializable;
import java.util.concurrent.TimeUnit;
import javax.annotation.PreDestroy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import vnet.sms.common.wme.acknowledge.SendSmsAckContainer;
import vnet.sms.common.wme.acknowledge.SendSmsNackContainer;
import vnet.sms.common.wme.send.SendSmsContainer;
import vnet.sms.gateway.nettysupport.publish.outgoing.OutgoingMessagesSender;
import vnet.sms.gateway.server.framework.Jmx;
import com.yammer.metrics.core.MetricName;
import com.yammer.metrics.core.MetricsRegistry;
import com.yammer.metrics.core.Timer;
import com.yammer.metrics.core.TimerContext;
/**
* @author obergner
*
*/
public class OutgoingMessagesSendingJmsMessageListener<ID extends Serializable> {
private static final MetricName JMS_MESSAGE_PROPAGATED_METRIC_NAME = new MetricName(
Jmx.GROUP,
"OutgoingJmsMessages",
"jms-message-propagated");
private final Logger log = LoggerFactory
.getLogger(getClass());
private final OutgoingMessagesSender<ID> outgoingMessagesSender;
private final MetricsRegistry metricsRegistry;
private final Timer jmsMessagePropagatedTimer;
/**
* @param outgoingMessagesSender
*/
public OutgoingMessagesSendingJmsMessageListener(
final OutgoingMessagesSender<ID> outgoingMessagesSender,
final MetricsRegistry metricsRegistry) {
notNull(outgoingMessagesSender,
"Argument 'outgoingMessagesSender' must not be null");
notNull(metricsRegistry, "Argument 'metricsRegistry' must not be null");
this.outgoingMessagesSender = outgoingMessagesSender;
this.metricsRegistry = metricsRegistry;
this.jmsMessagePropagatedTimer = this.metricsRegistry.newTimer(
JMS_MESSAGE_PROPAGATED_METRIC_NAME, TimeUnit.MILLISECONDS,
TimeUnit.SECONDS);
}
/**
* @param outgoingMessage
* @throws Exception
*/
public void handleMessage(final Object outgoingMessage) throws Exception {
this.log.debug("Preparing to send message {} ...", outgoingMessage);
final TimerContext duration = this.jmsMessagePropagatedTimer.time();
try {
if (outgoingMessage instanceof SendSmsContainer) {
this.outgoingMessagesSender.sendSms(SendSmsContainer.class
.cast(outgoingMessage));
} else if (outgoingMessage instanceof SendSmsAckContainer) {
this.outgoingMessagesSender
.ackReceivedSms(SendSmsAckContainer.class
.cast(outgoingMessage));
} else if (outgoingMessage instanceof SendSmsNackContainer) {
this.outgoingMessagesSender
.nackReceivedSms(SendSmsNackContainer.class
.cast(outgoingMessage));
} else {
throw new IllegalArgumentException("Unsupported message type ["
+ outgoingMessage.getClass().getName()
+ "] in message [" + outgoingMessage + "]");
}
} finally {
duration.stop();
}
this.log.debug("Successfully sent message {}", outgoingMessage);
}
@PreDestroy
public void close() {
this.log.info("Closing ...");
this.outgoingMessagesSender.close();
this.metricsRegistry.removeMetric(JMS_MESSAGE_PROPAGATED_METRIC_NAME);
this.log.info("Closed");
}
}