package com.destinationradiodenver.mobileStreaming.messageDriven;
import java.io.Serializable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.inject.Inject;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import org.jboss.logging.Logger;
import com.destinationradiodenver.mobileStreaming.application.Encoders;
import com.destinationradiodenver.mobileStreaming.messages.EncoderStatusMessage;
import com.destinationradiodenver.mobileStreaming.messages.EncoderStatusMessage.Status;
import com.destinationradiodenver.mobileStreaming.web.entity.Encoder;
@MessageDriven(name = "encoderStatusConsumer", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "java:jboss/jms/topic/encoderStatusTopic") })
public class EncoderStatusConsumer implements Serializable, MessageListener {
/**
* @author cpenhale
*/
private static final long serialVersionUID = 1102064321674684886L;
//Matches: rtmp://127.0.0.1/live/derp key=value key=value key=value
private static final Pattern LONG_FORM_URI_PATTERN = Pattern.compile("(^rtmp://.*/.*/.*)\\s(.*)\\s(.*)\\s(.*)");
private Logger log = Logger.getLogger(EncoderStatusConsumer.class);
@Inject
private Encoders encoders;
@PersistenceContext(unitName="mobileConsolePersistence")
EntityManager em;
public void onMessage(Message message) {
log.info("Recorder received a message");
try{
ObjectMessage objM = (ObjectMessage) message;
Object object = objM.getObject();
try{
EncoderStatusMessage statusMessage = (EncoderStatusMessage) object;
String rtmpUri = statusMessage.getUri();
Matcher matcher = LONG_FORM_URI_PATTERN.matcher(rtmpUri);
if(matcher.matches()){
rtmpUri = matcher.group(1);
}
log.infof("EncoderStatusMessage received from JMS Message (%s). Checking for associated encoder for RTMP URI \"%s\" with MobileProfile Name \"%s\"...",
objM.getJMSMessageID().toString(), rtmpUri, statusMessage.getName());
TypedQuery<Encoder> tQ = em.createQuery(
"select encoder from Encoder as encoder where encoder.stream.rtmpUri is :rtmpUri and encoder.mobileProfile.name is :mPName",
Encoder.class)
.setParameter("rtmpUri", rtmpUri)
.setParameter("mPName", statusMessage.getName());
try{
Encoder encoder = tQ.getSingleResult();
log.infof("Found a Encoder for RTMP URI %s", rtmpUri);
if(statusMessage.getStatus() == Status.STARTED_ENCODING){
log.infof("Adding Encoder for RTMP URI %s to list of active encoders", rtmpUri);
encoders.add(encoder);
}else if(encoders.contains(encoder)){
log.infof("Removing encoder for RTMP URI %s from list of active encoders", rtmpUri);
encoders.remove(encoder);
}else{
log.infof("Received a message from an inactive encoder for %s", rtmpUri);
}
}catch (NoResultException e){
log.infof("EncoderStatusMessage recieved for unknown RTMP URI %s", rtmpUri);
}
}catch(ClassCastException ccxTwo){
log.infof("Object in ObjectMessge %s not an EncoderStatusMessage", message.getJMSMessageID().toString());
}
}catch (ClassCastException ccx){
log.info("Not an ObjectMessage, ignoring");
} catch (JMSException e) {
log.errorf("JMS Exception: \n %s", e.getMessage());
} catch (Exception e){
log.error(e.getMessage());
}
}
}