package siebog.interaction;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import siebog.agents.AID;
import siebog.agents.Agent;
import siebog.agents.AgentManagerBean;
@MessageDriven(name = "MDBConsumer", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "queue/siebog"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })
public class MDBConsumer implements MessageListener {
private static final Logger LOG = LoggerFactory.getLogger(MDBConsumer.class);
@Inject
private AgentManagerBean agm;
@Override
public void onMessage(Message msg) {
try {
processMessage(msg);
} catch (JMSException ex) {
LOG.warn("Cannot process an incoming message.", ex);
}
}
private void processMessage(Message msg) throws JMSException {
ACLMessage acl = (ACLMessage) ((ObjectMessage) msg).getObject();
AID aid = getAid(msg, acl);
deliverMessage(acl, aid);
}
private AID getAid(Message msg, ACLMessage acl) throws JMSException {
int i = msg.getIntProperty("AIDIndex");
return acl.receivers.get(i);
}
private void deliverMessage(ACLMessage msg, AID aid) {
Agent agent = agm.getAgentReference(aid);
if (agent != null) {
agent.handleMessage(msg);
} else {
LOG.info("No such agent: {}", aid.getName());
}
}
}