diff --git a/test-harness/src/main/java/cz/moneta/test/harness/connectors/messaging/IbmMqConnector.java b/test-harness/src/main/java/cz/moneta/test/harness/connectors/messaging/IbmMqConnector.java index b0c9498..ca6684e 100644 --- a/test-harness/src/main/java/cz/moneta/test/harness/connectors/messaging/IbmMqConnector.java +++ b/test-harness/src/main/java/cz/moneta/test/harness/connectors/messaging/IbmMqConnector.java @@ -1,5 +1,28 @@ package cz.moneta.test.harness.connectors.messaging; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.jms.BytesMessage; +import javax.jms.JMSConsumer; +import javax.jms.JMSContext; +import javax.jms.JMSException; +import javax.jms.JMSRuntimeException; +import javax.jms.Message; +import javax.jms.TextMessage; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.ibm.mq.jms.MQConnectionFactory; +import com.ibm.msg.client.wmq.WMQConstants; + import cz.moneta.test.harness.connectors.Connector; import cz.moneta.test.harness.messaging.MessageContentType; import cz.moneta.test.harness.messaging.MqMessageFormat; @@ -9,22 +32,6 @@ import cz.moneta.test.harness.messaging.exception.MessagingDestinationException; import cz.moneta.test.harness.messaging.exception.MessagingTimeoutException; import cz.moneta.test.harness.support.messaging.ImqRequest; -import com.ibm.mq.jms.MQConnectionFactory; -import com.ibm.msg.client.wmq.WMQConstants; -import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import javax.jms.*; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; - /** * IBM MQ connector using JMS client with Jakarta JMS API. Supports * multi-instance Queue Manager, SSL/TLS, and multiple message formats. @@ -277,36 +284,27 @@ public class IbmMqConnector implements Connector { public List browse(String queueName, String messageSelector, MqMessageFormat format, int maxMessages) { List messages = new ArrayList<>(); - javax.jms.Queue queue = getQueue(queueName); - MessageConsumer consumer = (MessageConsumer) (messageSelector == null || messageSelector.isBlank() - ? jmsContext.createConsumer(queue) - : jmsContext.createConsumer(queue, messageSelector)); - int count = 0; - try { - while (count < maxMessages) { - Message message = consumer.receiveNoWait(); + try (javax.jms.QueueBrowser browser = (messageSelector == null || messageSelector.isBlank()) + ? jmsContext.createBrowser(queue) + : jmsContext.createBrowser(queue, messageSelector)) { - if (message == null) { - break; + Enumeration enumeration = browser.getEnumeration(); + int count = 0; + + while (enumeration.hasMoreElements() && count < maxMessages) { + Message message = (Message) enumeration.nextElement(); + if (message != null) { + ReceivedMessage received = decodeMessage(message, queueName, format); + messages.add(received); + count++; } - - ReceivedMessage received = decodeMessage(message, queueName, format); - messages.add(received); - count++; } return messages; - - } catch (Exception e) { + } catch (JMSException e) { throw new MessagingDestinationException("Failed to browse queue: " + queueName, e); - } finally { - try { - consumer.close(); - } catch (JMSException e) { - LOG.warn("Failed to close consumer", e); - } } } diff --git a/tests/src/test/java/cz/moneta/test/system/messaging/ImqBrowseTest.java b/tests/src/test/java/cz/moneta/test/system/messaging/ImqBrowseTest.java new file mode 100644 index 0000000..b12ca96 --- /dev/null +++ b/tests/src/test/java/cz/moneta/test/system/messaging/ImqBrowseTest.java @@ -0,0 +1,19 @@ +package cz.moneta.test.system.messaging; + +import java.util.List; + +import cz.moneta.test.harness.annotations.TestCase; +import cz.moneta.test.harness.annotations.TestScenario; +import cz.moneta.test.harness.endpoints.imq.ImqFirstVisionQueue; +import cz.moneta.test.harness.messaging.ReceivedMessage; + +@TestScenario(name = "IBM MQ Browse Test") +public class ImqBrowseTest { + + @TestCase(name = "Browse messages in queue") + public void browseMessagesInQueue(cz.moneta.test.dsl.Harness harness) { + List peeked = harness.withImqFirstVision().fromQueue(ImqFirstVisionQueue.PAYMENT_NOTIFICATIONS) + .browse(10); + assert !peeked.isEmpty() : "Expected to find messages in the queue, but it was empty."; + } +}