【问题标题】:Mule how to make jms outbound endpoint to use ObjectMessage instead of StreamMessageMule 如何使 jms 出站端点使用 ObjectMessage 而不是 StreamMessage
【发布时间】:2013-02-28 05:18:53
【问题描述】:

我有一个带有自定义拦截器的 Mule 流,它构造一个对象并将其转发到 JMS 出站端点。 JMS 端点在尝试将 Object 转换为 JMS StreamMessage 时抛出异常。我想要的是端点将 Object 转换为 JMS ObjectMessage。那要怎么做呢?

这是我的流程;

<spring:beans>
    <spring:bean id="connectionFactoryFactory" name="connectionFactoryFactory"
        class="ConnectionFactoryFactory">
        <spring:property name="properties">
            <spring:props>
                <spring:prop key="imqAddressList">mqtcp://localhost:30001/jms</spring:prop>
                <spring:prop key="imqReconnectAttempts">-1</spring:prop>
            </spring:props>
        </spring:property>
    </spring:bean>

    <spring:bean id="connectionFactory" name="connectionFactory"
        factory-bean="connectionFactoryFactory" factory-method="createConnectionFactory" />
</spring:beans>

<jms:connector name="JMSConnector" connectionFactory-ref="connectionFactory"
    specification="1.1" doc:name="JMS" />

<flow name="Request" doc:name="Request">
    <quartz:inbound-endpoint responseTimeout="10000"
        doc:name="InfoRequest" jobName="InfoRequest" repeatInterval="5000">
        <quartz:event-generator-job />
    </quartz:inbound-endpoint>
    <custom-interceptor class="StateRequest"/>
    <jms:outbound-endpoint connector-ref="JMSConnector"
        doc:name="JMS" topic="requests"/>
</flow>

我也尝试将对象添加到 JMS 消息转换器;

<jms:object-to-jmsmessage-transformer returnClass="javax.jms.ObjectMessage" name="Object_to_JmsMessage" doc:name="Object to JmsMessage"/>

    <jms:outbound-endpoint connector-ref="JMSConnector"
        doc:name="JMS" topic="requests" transformer-refs="Object_to_JmsMessage"/>

【问题讨论】:

  • 为什么要使用拦截器?您是否希望阻止流程继续执行?
  • 还有拦截器返回的类型是什么?是否实现Serializable
  • 是的,有时我不需要请求其他信息。拦截器创建一个 Request 对象,实现 Serializable。我已经序列化了对象并发送了字节,我认为它创建了一个 BytesMessage,但服务器实现者告诉我他的代码将只接受一个 ObjectMessage。
  • 服务器实现者糟透了 :) ObjectMessages 依赖于 Java 序列化,因此是紧密耦合的,这在消息传递环境中是不希望的。根据源码,如果Mule Message payload是Serializable(不是List也不是String),Mule会自动创建ObjectMessage,不需要手动配置任何transformer...
  • 完全!别再看了:这个类是List,所以Mule将它序列化为StreamMessage。不幸的是,这种行为是在一个静态类中,因此很难与另一个类交换。从代码或子类 AbstractJmsTransformer 创建您自己的 JMS ObjectMessage 以创建您自己的 ObjectToJMSMessage 风格,它将为 Request 类型的有效负载调用 JmsMessageUtils.serializableToMessage

标签: mule mule-studio


【解决方案1】:

因为Request extends LinkedList&lt;RequestId&gt; implements Serializable,Mule会自动将此类型转换为StreamMessage

不幸的是,这种行为是在一个静态类中,因此很难与另一个类交换。从代码或子类 AbstractJmsTransformer 创建您自己的 JMS ObjectMessage 以创建您自己的 ObjectToJMSMessage 风格,它将调用 JmsMessageUtils.serializableToMessage 以获取 Request 类型的有效负载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-04
    • 2012-06-23
    • 2014-01-26
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多