【问题标题】:MDB onMessage() various response message for an unique requestMDB onMessage() 对唯一请求的各种响应消息
【发布时间】:2018-08-17 22:10:12
【问题描述】:

我目前对 MDB 非常缺乏经验。我想向 JMS 响应队列发送各种消息。问题是 onMessage() 是一种事务方法,这一事实不允许我通过交错睡眠发送各种消息。有没有一种方法可以针对一个请求消息发送多个响应消息?我已经尝试过上下文事务。这是我的 onMessage 方法:

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();
            }

        }

    }

在 ejb-jar.xml 中,我将 Required 设置为 trans-attribute。

【问题讨论】:

    标签: jakarta-ee jms ejb


    【解决方案1】:

    我看到了两种解决方法:

    1. 将您的 trans-attribute 设置为 NOT_SUPPORTED。这将阻止 onMessage() 在事务中运行。

    2. 使用不会自动在调用方事务中登记其连接的连接工厂(即避免使用基于 JCA 的连接工厂)。

    【讨论】:

      猜你喜欢
      • 2010-09-12
      • 2012-06-20
      • 2016-03-22
      • 2014-06-29
      • 2014-06-21
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 2018-02-15
      相关资源
      最近更新 更多