apache / apache/jmeter

Send test message to java app using jmeter (jms,mq) plugin

Open
#6,102 0 comments 0 reactions 0 assignees View on GitHub
defect to-triage
Dominant language
Java
Stars
9.5k
Forks
2.3k
Avg merge
1d 22h
Merged PRs (30d)
5

Description

Hi
I try to use jms and mq plugin of jmeter to send message to my java app, like this:
Jmeter > mq > java-app

On java app got this error:

2023-07-15 15:46:49,538 ERROR CUS-10636 [JmsListener] FATAL: exception in read message on listener: com.ibm.jms.JMSBytesMessage cannot be cast to javax.jms.TextMessage

https://github.com/JoseLuisSR/mqmeter/issues/16

Here is the code of java app:
package mylib.platform.service.endpoint.jms;

import mylib.common.boot.SystemVerifier;
import mylib.common.exception.CommonExceptionCode;
import mylib.common.exception.ExceptionLogger;
import mylib.common.exception.MYRuntimeException;
import mylib.common.monitoring.UniqueID;
import mylib.common.platform.Constants;
import mylib.common.platform.message.EndpointMessage;
import mylib.common.util.str.StringUtility;
import mylib.platform.domain.endpoint.Endpoint;
import mylib.platform.domain.endpoint.Inpoint;
import mylib.platform.domain.endpoint.Outpoint;
import mylib.platform.service.core.MYCore;
import mylib.platform.service.endpoint.EndpointService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.jms.*;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.concurrent.atomic.AtomicInteger;

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class JmsListener implements MessageListener {

private static final Logger LOGGER = LoggerFactory.getLogger(JmsListener.class);
private static AtomicInteger count = new AtomicInteger(0);

@EJB
private SystemVerifier systemVerifier;

@EJB
private MYCore myCore;

@EJB
private EndpointService endpointService;

@Resource
private String defaultName = "";

private EndpointMessage extractEndpointMessage(Message message, Inpoint inpoint, long receiveTime) throws JMSException, UnsupportedEncodingException {
String text;
if (inpoint == null)
throw new MYRuntimeException(CommonExceptionCode.NULL_POINTER, "JmsListener", "inpoint");

if (inpoint.getMessageType() == Endpoint.MessageType.BYTE) {
BytesMessage byteMessage = (BytesMessage) message;
byte[] byteData = new byte[(int) byteMessage.getBodyLength()];
byteMessage.readBytes(byteData);
text = new String(byteData, inpoint.getEncoding());
} else {
text = ((TextMessage) message).getText();
}

Outpoint replyEndpoint = endpointService.getOutpoint(inpoint.getReplyEndpoint());

Date arrivalTime = new Date(message.getJMSTimestamp());
int expirationTime = inpoint.getTimeToLive();

EndpointMessage em = new EndpointMessage(text, inpoint.getName(), replyEndpoint.getName(), arrivalTime, expirationTime);
em.setReceiveTime(receiveTime);
em.setCookie(extractCookie(message));

if (!StringUtility.isNullOrEmpty(message.getJMSCorrelationID()))
em.setCorrelationID(message.getJMSCorrelationID());
else if (message.getJMSReplyTo() != null)
em.setCorrelationID(message.getJMSMessageID());

return em;
}

private String extractCookie(Message message) throws JMSException {
Object obj = message.getObjectProperty(Constants.MY_COOKIE);
if (obj == null)
return null;
if (!(obj instanceof String)) {
throw new RuntimeException("Invalid Cookie");
}
return (String) obj;
}

private Inpoint extractInpoint(Message message) throws JMSException {

String source = message.getStringProperty(Constants.SOURCE_NAME);
if (StringUtility.isNullOrEmpty(source)) {

if (message.getJMSDestination() != null) {
String destination = message.getJMSDestination().toString();
source = destination.substring(destination.lastIndexOf('/') + 1);
} else {
source = defaultName;
}
}

Endpoint result = endpointService.getEndpointByQueueName(source);
if (result == null || result instanceof Outpoint)
throw new MYRuntimeException(CommonExceptionCode.INVALID_ENDPOINT_NAME, source);
return (Inpoint) result;
}

@PostConstruct
public void init() {
if (systemVerifier != null)
if (!systemVerifier.isReadyToStart())
LOGGER.error("NEVER HAPPENS");
else
LOGGER.debug("################### MDB {} is ready to start...", count.incrementAndGet());
}

@Override
public void onMessage(Message message) {
EndpointMessage epMsg;
try {
//TODO check PCI constraint
if (message == null)
throw new MYRuntimeException(CommonExceptionCode.NULL_POINTER, "JmsListener", "message");

long receiveTime = System.currentTimeMillis();

Inpoint inpoint = extractInpoint(message);
MDC.put("source", inpoint.getName() + "-" + UniqueID.getNewID());

epMsg = extractEndpointMessage(message, inpoint, receiveTime);

String log = inpoint.isLogMessage() ? epMsg.getData() : StringUtility.getStarred(epMsg.getData(), 30);
LOGGER.info("Receive Message[{}] Q[{}] CID[{}] Cookie[{}]", log, inpoint.getQueueName(), epMsg.getCorrelationID(), epMsg.getCookie());

myCore.processEndpointMessage(epMsg);

} catch (Exception e) {
LOGGER.error("FATAL: exception in read message on listener: {}", e.getMessage());
ExceptionLogger.log("FATAL: exception in read message on listener", e);
} finally {
MDC.clear();
}
}

}

Any Idea?
Thanks

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.