如何在Mule中设置ActiveMQ消息头?

3
我正在使用 MuleStudio 3.5.0 并尝试创建一个流程,该流程将消息发送到 ActiveMQ 队列。该队列由一个旧的现有服务(用 .Net 编写)消耗,我希望将其集成到我的工作流程中。该服务期望消息的标头Type设置为 "DoStuff"。我应该如何做到这一点? 我尝试了以下流程。请注意,出于测试目的,我通过 DoStuff 类手动设置了 ActiveMQ 消息的有效载荷,HTTP 连接器仅用于触发工作流程:
<jms:activemq-connector name="Active_MQ" brokerURL="tcp://localhost:61616" validateConnections="true" doc:name="Active MQ"/>
<spring:beans>
    <spring:bean id="DoStuffBean" name="DoStuffBean" class="foo.DoStuff"/>
</spring:beans>
<flow name="Flow1" doc:name="Flow1">
    <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8199" path="activemq" doc:name="HTTP"/>
    <component doc:name="Java" class="com.kws.mule.DoStuff"/>
    <json:object-to-json-transformer doc:name="Object to JSON"/>
    <jms:outbound-endpoint queue="MyServiceQueue" connector-ref="Active_MQ" doc:name="JMS">
        <jms:object-to-jmsmessage-transformer name="ObjectToJmsMessage" />
        <message-properties-transformer>
            <add-message-property key="Type" value="DoStuff" />
        </message-properties-transformer>
    </jms:outbound-endpoint>
</flow>
但这样行不通,因为设置的不是header Type,而是一个属性。这在ActiveMQ broker manager console的图片中显示:

The property Type is set, but not the header

参考代码如下:DoStuff类:

public class DoStuff implements Callable {
    private String jobId;
    private String createdTime;

    public String getJobId()
    {
        return this.jobId;
    }

    public String getResult()
    {
        return this.createdTime;
    }

    @Override
    public Object onCall(MuleEventContext eventContext) throws Exception {
        DoStuff result = new DoStuff();
        result.jobId = "abd4df7b-0f31-41b4-826a-3dbbe77df7eb";
        result.createdTime = "0001-01-01T00:00:00";

        eventContext.getMessage().setPayload(result);
        return eventContext.getMessage();
    }
}
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
4

这个流程应该是有效的:

<flow name="Flow1" doc:name="Flow1">
    <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8199" path="activemq" doc:name="HTTP"/>
    <component doc:name="Java" class="com.kws.mule.DoStuff"/>
    <json:object-to-json-transformer doc:name="Object to JSON"/>
    <jms:outbound-endpoint queue="MyServiceQueue" connector-ref="Active_MQ" doc:name="JMS">
        <jms:object-to-jmsmessage-transformer name="ObjectToJmsMessage" />
        <expression-transformer returnSourceIfNull="true"
            doc:name="Expression"
            expression="#[payload.setJMSType(&quot;DoStuff&quot;); return payload]" />
    </jms:outbound-endpoint>
</flow>

0
在MEL中,你可以这样做
<set-property propertyName="Type" value="Set your value here"/>

这将在Mule Message上设置一个出站属性,该属性将作为入站属性由JMS队列接收


1
谢谢你的回答!不幸的是,这会设置消息的 属性 Type,但不是我想要的 _头部_。我猜我的回答不够清晰,所以我稍微更新了一下。 - Desty
当您尝试检索此属性时,会得到什么?尝试创建另一个流,其中'inbound-endpoint'作为此Active MQ,并在那里检索此属性。看看您会得到哪个。 - Charu Khurana
你说得对,如果我使用Mule构建一个新的inbound-endpoint,我可以获取属性。但是已经存在的消费ActiveMQ队列的服务不是用Mule构建的,而是一个旧的.Net应用程序,它期望填充Type _header_。不幸的是,由于这部分是专有的,我无法访问ActiveMQ消费源代码,因此我想设置JMS消息的头。 - Desty
"<set-property>" 是设置头部的最佳方式。你应该尝试查看 .Net 应用程序获取的 "Type" 是什么。也许它正在获取正确的类型。 - Charu Khurana
由于 .Net 应用程序不知道存在这样的自定义属性,它无法解析消息,仍然需要头部 :( 如果我通过 ActiveMQ 经纪人管理控制台 发送自定义消息并设置类型头,则 .Net 应用程序可以正常工作。 - Desty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,