Взаимодействие Java c MQ очередями
Всем привет! Есть интересный вопрос, возможно ли как то привинтить слушателя MQ очередей с помощью java? Нашел код который позволяет записывать сообщение в MQ очередь и вычитывать из MQ очереди, но для каждой вычитки сообщений необходимо явно вызывать метод, хотелось бы каким то образом настроить слушателя MQ очереди и если в очередь кладут сообщение, то сразу его вычитывать и удалять из очереди. Кусок кода с помощью которого записываю(JmsProducer.java) и вычитываю(JmsBrowser.java) сообщения из очереди.
JmsProducer.java
package mq;
import lombok.extern.slf4j.Slf4j;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.TextMessage;
@Slf4j
public class JmsProducer extends JmsBase {
private MessageProducer producer = null;
public JmsProducer() {
super();
try {
if (producer != null)
producer.close();
} catch (JMSException jmse) {
recordFailure(jmse);
}
}
@Override
protected void doAction(String msg) {
if (msg == null) {
log.error("Error, it is impossible to put a null message");
} else {
try {
producer = session.createProducer(destination);
TextMessage message = session.createTextMessage(msg);
producer.send(message);
log.info("JMS сообщение отправлено!\n");
} catch (JMSException e) {
status = -2;
log.info("JMS сообщение не отправлено!\n" + e);
recordFailure(e);
} finally {
try {
if (producer != null) producer.close();
} catch (JMSException jmse) {
recordFailure(jmse);
}
}
}
}
public void writeMessage(String msg){
init();
doAction(msg);
destroy();
}
@Override
protected void doAction() {
}
}
JmsBrowser.java
package mq;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.QueueBrowser;
import java.util.Enumeration;
public class JmsBrowser extends JmsBase{
private QueueBrowser queueBrowser = null;
public JmsBrowser(){
super();
try {
if (queueBrowser != null)
queueBrowser.close();
} catch (JMSException jmsex) {
recordFailure(jmsex);
}
}
@Override
protected void doAction() {
try {
queueBrowser = session.createBrowser(destination);
// Чтение сообщений
Enumeration<?> messages = queueBrowser.getEnumeration();
int count = 0;
Message message;
// Просмотр сообщений
System.out.println("Просмотр JMS сообщений : ");
while (messages.hasMoreElements()) {
message = (Message) messages.nextElement();
System.out.println("\nСообщение " + (++count) + " :");
System.out.println(message);
}
} catch (JMSException e) {
e.printStackTrace();
}
}
public void readMessage(){
destroy();
init();
doAction();
destroy();
}
@Override
protected void doAction(String msg) {
}
}
JmsBase.java
package mq;
import com.ibm.msg.client.jms.JmsConnectionFactory;
import com.ibm.msg.client.jms.JmsFactoryFactory;
import com.ibm.msg.client.wmq.WMQConstants;
import lombok.extern.slf4j.Slf4j;
import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.Session;
@Slf4j
public abstract class JmsBase {
// статус выполнения приложения
protected static int status = 1;
protected Session session = null;
protected Queue destination = null;
protected Connection connection = null;
private String host = "localhost";
private int port = 1417;
private String channel = "SYSTEM.DEF.SVRCONN";
private String queueManagerName = "IBM2QMGR";
private String queueName = "REQUEST";
private boolean clientTransport = false;
protected abstract void doAction();
protected abstract void doAction(String msg);
protected void init(){
try {
createConnection();
session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue(queueName);
connection.start();
}
catch (JMSException jmsex) {
recordFailure(jmsex);
}
}
protected void destroy(){
try {
if (session != null)
session.close();
if (connection != null)
connection.close();
} catch (JMSException jmsex) {
log.error("" + jmsex.getMessage());
recordFailure(jmsex);
}
}
private void createConnection() {
JmsFactoryFactory ff;
JmsConnectionFactory cf;
try {
ff = JmsFactoryFactory.getInstance(
WMQConstants.WMQ_PROVIDER);
cf = ff.createConnectionFactory();
// Set the properties
cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, host);
cf.setIntProperty(WMQConstants.WMQ_PORT, port);
cf.setStringProperty(WMQConstants.WMQ_CHANNEL, channel);
if (clientTransport) {
cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE,
WMQConstants.WMQ_CM_CLIENT);
} else {
cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE,
WMQConstants.WMQ_CM_BINDINGS);
}
cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER,
queueManagerName);
connection = cf.createConnection();
} catch (JMSException jmsex) {
recordFailure(jmsex);
}
}
}
Подскажите, с помощью чего можно реализовать данную задачу, если это вообще возможно реализовать с помощью Java. Буду признателен за подсказку