package org.jbpm.task.service.jms;
import java.io.IOException;
import java.util.Properties;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.naming.Context;
import javax.naming.InitialContext;
import org.jbpm.task.service.TaskServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class BaseJMSTaskServer extends TaskServer {
private boolean running;
private static final Logger logger = LoggerFactory.getLogger(BaseJMSTaskServer.class);
private JMSTaskServerHandler handler;
private Properties connectionProperties;
private Context context;
private Queue queue;
private Queue responseQueue;
private QueueConnection connection;
private QueueSession session;
private MessageConsumer consumer;
public BaseJMSTaskServer(JMSTaskServerHandler handler, Properties properties, Context context) {
this.handler = handler;
this.connectionProperties = properties;
this.context = context;
}
public void run() {
try {
start();
while (this.running) {
Message clientMessage = this.consumer.receive();
if (clientMessage != null) {
Object object = readMessage(clientMessage);
String selector = readSelector(clientMessage);
this.handler.messageReceived(this.session, object, this.responseQueue, selector);
}
}
} catch (JMSException e) {
if ("102".equals(e.getErrorCode())) {
logger.info(e.getMessage());
} else {
logger.error(e.getMessage());
}
} catch (Exception e) {
throw new RuntimeException("Error leyendo mensaje", e);
}
}
private Object readMessage(Message msgReceived) throws IOException {
ObjectMessage strmMsgReceived = (ObjectMessage) msgReceived;
try {
return strmMsgReceived.getObject();
} catch (JMSException e) {
throw new IOException("Error reading message");
}
}
private String readSelector(Message msgReceived) throws JMSException {
return msgReceived.getStringProperty(TaskServiceConstants.SELECTOR_NAME);
}
public void start() throws Exception {
Context ctx = this.context;
if (this.context == null) {
ctx = new InitialContext();
}
String connFactoryName = this.connectionProperties.getProperty(TaskServiceConstants.TASK_SERVER_CONNECTION_FACTORY_NAME);
boolean transacted = Boolean.valueOf(this.connectionProperties.getProperty(TaskServiceConstants.TASK_SERVER_TRANSACTED_NAME));
String ackModeString = this.connectionProperties.getProperty(TaskServiceConstants.TASK_SERVER_ACKNOWLEDGE_MODE_NAME);
String queueName = this.connectionProperties.getProperty(TaskServiceConstants.TASK_SERVER_QUEUE_NAME_NAME);
String responseQueueName = this.connectionProperties.getProperty(TaskServiceConstants.TASK_SERVER_RESPONSE_QUEUE_NAME_NAME);
int ackMode = Session.DUPS_OK_ACKNOWLEDGE; //default
if ("AUTO_ACKNOWLEDGE".equals(ackModeString)) {
ackMode = Session.AUTO_ACKNOWLEDGE;
} else if ("CLIENT_ACKNOWLEDGE".equals(ackModeString)) {
ackMode = Session.CLIENT_ACKNOWLEDGE;
}
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup(connFactoryName);
try {
this.connection = factory.createQueueConnection();
this.session = connection.createQueueSession(transacted, ackMode);
this.queue = this.session.createQueue(queueName);
this.responseQueue = this.session.createQueue(responseQueueName);
this.consumer = this.session.createReceiver(this.queue);
this.connection.start();
} catch (JMSException e) {
throw new RuntimeException("No se pudo levantar la cola servidora del JMSTaskServer", e);
}
this.running = true;
}
public void stop() throws Exception {
if (this.running) {
this.running = false;
closeAll();
}
}
private void closeAll() throws JMSException {
this.consumer.close();
this.session.close();
this.connection.close();
}
public boolean isRunning() {
return this.running;
}
}