Jakarta ee MDB onMessage()针对唯一请求的各种响应消息
我目前对MDB非常缺乏经验。我想向JMS响应队列发送各种消息。问题在于onMessage()是一种事务性方法,这一事实不允许我使用交错休眠发送各种消息。是否有一种方法可以针对一条请求消息发送多条响应消息?我尝试过上下文事务。以下是我的onMessage方法:Jakarta ee MDB onMessage()针对唯一请求的各种响应消息,jakarta-ee,jms,ejb,Jakarta Ee,Jms,Ejb,我目前对MDB非常缺乏经验。我想向JMS响应队列发送各种消息。问题在于onMessage()是一种事务性方法,这一事实不允许我使用交错休眠发送各种消息。是否有一种方法可以针对一条请求消息发送多条响应消息?我尝试过上下文事务。以下是我的onMessage方法: public void onMessage(Message message) { synchronized (this) { try { LOG.debug("R
public void onMessage(Message message) {
synchronized (this) {
try {
LOG.debug("Received a message" + SystemUtils.LINE_SEPARATOR + message);
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
this.logMessage(textMessage, textMessage.getJMSDestination().toString(), "request");
String body = textMessage.getText();
Document doc = XMLHelper.parseText(body);
int amountOfXq = Integer.parseInt((String) AIAMultipleResponseEmulatorBean.initialCtx.lookup("java:comp/env/XQY_COUNT"));
for (int i = 0; i <= (amountOfXq - 1); i++) {
this.ctx.getUserTransaction().begin();
this.xqueryUri = new URI((String) AIAMultipleResponseEmulatorBean.initialCtx.lookup("java:comp/env/" + i));
LOG.debug(XMLHelper.prettyPrintXML(doc));
JMSHelper helper = JMSHelper.instance(this.destinationName);
TextMessage response = helper.createTextMessage();
System.out.println("Response just after creation: " + response.getText());
response.setStringProperty("MESSAGE_TYPE", "EMULATOR_RESPONSE");
response.setStringProperty("APPLICATION_TYPE", this.getClass().getName());
response.setStringProperty("APPLICATION_ID", this.getClass().getName());
response.setIntProperty("VERSION_ID", 1);
response.setJMSDeliveryMode(message.getJMSDeliveryMode());
LOG.debug("JMSCorrelationID=" + message.getJMSCorrelationID());
String osmID = this.getOSMID(message);
System.out.println("CorrelationID completo: " + message.getJMSCorrelationID());
System.out.println("CorrelationID osmID: " + osmID);
if( i == 0) {
response.setJMSCorrelationID(message.getJMSCorrelationID());
}else{
response.setJMSCorrelationID("TESA-CORR-" + osmID);
System.out.println("CorrelationID osmID: TESA-CORR-" + osmID);
}
response.setJMSPriority(message.getJMSPriority());
this.transformRequestToResponse(body, response); // HERE
this.logMessage(response, textMessage.getJMSDestination().toString(), "response");
LOG.debug(response.getText());
helper.sendMessageNoResponse(response);
//TimeUnit.SECONDS.sleep(5);
Thread.sleep(5000);
this.ctx.getUserTransaction().commit();
}
}
} catch (Exception var9) {
LOG.error("onMessage:Exception:[" + var9.getMessage() + "]", var9);
this.ctx.setRollbackOnly();
}
}
}
public-void-onMessage(消息消息){
已同步(此){
试一试{
LOG.debug(“收到消息”+SystemUtils.LINE\u分隔符+消息);
如果(文本消息的消息实例){
text消息text消息=(text消息)消息;
this.logMessage(textMessage,textMessage.getJMSDestination().toString(),“请求”);
String body=textMessage.getText();
Document doc=XMLHelper.parseText(正文);
int-amountOfXq=Integer.parseInt((字符串)aimultipleresponseemulatorbean.initialCtx.lookup(“java:comp/env/XQY_COUNT”);
对于(int i=0;i我认为有两种方法可以解决这个问题:
将您的trans属性设置为不受支持。这将阻止在事务中运行onMessage()
使用不会在调用方事务中自动登记其连接的连接工厂(即,避免使用基于JCA的连接工厂)