2014-05-09 27 views
2

我正在使用MuleStudio 3.5.0并尝试创建一个将消息发送到ActiveMQ队列的流程。该队列由旧的现有服务(以.Net编写)使用,我想将其集成到我的工作流程中。该服务期望邮件的标头Type被设置为“DoStuff”。我怎样才能做到这一点?如何在Mule中设置ActiveMQ消息头?

我试过以下流程。需要注意的是用于测试目的我通过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> 

但是,这并不工作,因为不是Type已设置,但属性。

The property Type is set, but not the header

仅供参考这里是DoStuff类:这是从ActiveMQ代理管理控制台图所示

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

回答

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"/> 

这将设置出站属性上会被JMS Queue被接收为入埠财产Mule Message

+1

谢谢您的回答!不幸的是,这设置了消息的_property_'Type',而不是_header_,这正是我想要的。我想我的答案还不够清楚,所以我更新了一下。 – Desty

+0

当您尝试检索此属性时,您会得到什么。尝试使用'inbound-endpoint'创建另一个流作为此活动MQ并在那里检索此属性。看看你会得到哪一个 –

+0

你说得对,如果我用Mule构建一个新的消费'入站 - 终点',我就可以获得这个属性。但是已经存在的使用ActiveMQ队列的服务不是用Mule构建的,而是一个旧的.Net应用程序,它期望Type _header_被填充。不幸的是我没有访问ActiveMQ消费源代码,因为这部分是专有的,因此我想设置JMS消息的头部。 – Desty