【问题标题】:How to fetch JMSMessageID from JMS response如何从 JMS 响应中获取 JMSMessageID
【发布时间】:2017-01-10 01:31:41
【问题描述】:

我试图找到一种方法,但未能成功获取在将消息发送到队列后作为来自 JMS 的响应的 JMSMessageID。有人可以帮我吗?谢谢。 (这个问题类似于Extract JMSMessageID on response from JMS Queue,但我既不能评论也不能重新请求同一个问题,所以根据建议创建一个新问题)

【问题讨论】:

    标签: mule


    【解决方案1】:

    您可以使用响应转换器 java 类来执行此操作。请务必在此之前放置一个 objectToJms 转换器。

    import javax.jms.JMSException;
    import javax.jms.Message;
    
    import org.apache.commons.lang.StringUtils;
    import org.mule.api.MuleMessage;
    import org.mule.api.transformer.TransformerException;
    import org.mule.api.transport.PropertyScope;
    import org.mule.transformer.AbstractMessageTransformer;
    
    public class ExtractJmsMessageIdTransformer extends AbstractMessageTransformer {
    
        @Override
        public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException {
    
             if (message.getPayload() instanceof Message) {
                 Message jmsMessage = (Message) message.getPayload();
                 String jmsMessageId = null;
                 try {
    
                     jmsMessageId = jmsMessage.getJMSMessageID();
                     logger.info("Found JmsMessage as payload. jmsMessageId = " + jmsMessageId)
                 } catch (final JMSException e) {
                     throw new TransformerException(this, e);
                 }
             }
    
            return message;
        }
    

    }

    EDIT1 每条评论

    您没有在响应转换器上定义 ExtractJmsMessageIdTransformer 类。在您的 mule-config.xml 中添加以下内容

    <custom-transformer class="mypack.ExtractJmsMessageIdTransformer" name="extractJmsMessageIdTransformer"/>
    
    <jms:object-to-jmsmessage-transformer name="objectToJms" />
    

    然后像这样定义你的 JMS 队列

    <jms:outbound-endpoint exchange-pattern="request-response" disableTemporaryReplyToDestinations="true" queue="sample" connector-ref="JMS"
                               doc:name="JMS" transformer-refs="objectToJms" responseTransformer-refs="objectToJms extractJmsMessageIdTransformer"/>
        <logger level="INFO" doc:name="Logger" message="#[message.outboundProperties]"/>
    

    【讨论】:

    • 我的 ID 为空,是从输入中记录的吗?
      我的 XML 如下: ''
      日志显示以下输出: mypack.ExtractJmsMessageIdTransformer: 找到 JmsMessage 作为有效负载。 jmsMessageId = null。
    • 感谢您的回复。很抱歉我的格式响应不好,我仍在调整。请检查我上面的代码并提出需要更正的地方。
    • 基本上,我使用单向或请求-响应交换模式与 TIBCO EMS,我只会得到 NullPayload,因此没有 JMSMessageID。我们是否在 Mule 流程的配置端遗漏了一些东西,或者只是在 TIBCO EMS 中遗漏了一些东西?我不能使用 TIBCO EMS 声明它,因为基本的 TIBCO JMS 流将立即在响应模式中获取 messageid。还尝试了一个示例 java 代码,我成功获取了实际发送的消息的 JMSMessageID,只是 Mule 流无法获取它。请问配置/代码端还有其他建议吗?提前致谢。
    • 有人建议对 jms:outbound-endpoint 使用 disableTemporaryReplyToDestinations="true",它没有用。这看起来与临时目的地有关,所以听起来没什么用处。
    • 感谢您再次光临。看起来作为 EMS 响应填充的 MuleMessage 没有这些属性,所以尝试这个逻辑也没有多大帮助。我刚刚在转换器中打印了消息和有效负载,下面是输出。 'ObjectMessage={ Header={ JMSMessageID={null} JMSDestination={null} JMSReplyTo={null} JMSDeliveryMode={PERSISTENT} JMSRedelivered={false} JMSCorrelationID={null} JMSType={null} JMSTimestamp={0} JMSDeliveryTime={ 0} JMSExpiration={0} JMSPriority={4} } 属性={ MULE_SESSION={big-id-here} } 对象={{NullPayload}} }'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2020-01-24
    • 2017-09-19
    相关资源
    最近更新 更多