早上好,我正在尝试设置一个属性并访问它。但未能访问属性集。 我试图访问从客户端设置的SplitterAggregator中的属性。 以下是mule配置。
<flow name="statementRequestFlow">
<vm:inbound-endpoint path="statementRequest" />
<vm:outbound-endpoint path="statementSplit" />
</flow>
<flow name="statementSplitFlow">
<vm:inbound-endpoint path="statementSplit" />
<splitter evaluator="xpath" expression="/DocumentJournal/StatementsData/Statement" />
<vm:outbound-endpoint path="statementResponse" transformer-refs="domToXml" />
</flow>
<flow name="statementResponseFlow">
<vm:inbound-endpoint path="statementResponse" transformer-refs="XmlToStatement"/>
<custom-aggregator timeout="5000" class="com.test.splitter.SplitterAggregator"/>
<component class="com.test.splitter.StatementAggregator">
<method-entry-point-resolver>
<include-entry-point method="collectStatements"/>
</method-entry-point-resolver>
</component>
</flow>
在这个版本中,我只是创建了一个HashMap作为道具,并按名称“my_key”放置了一个属性,并将其传递给sendAsync。
String applicationDataAsXml = "<DocumentJournal>...........</DocumentJournal>";
MuleClient muleClient = MuleClientSingleton.getMuleClient();
try {
Map<String,Object> props = new HashMap<String,Object>();
props.put("MessageProperties", "MessageProperties");
props.put("my_key", "my_value");
muleClient.sendAsync("vm://statementRequest", applicationDataAsXml, props);
}catch(Exception e) {
e.printStackTrace();
}
public class SplitterAggregator extends AbstractAggregator {
@Override
public MuleEvent process(MuleEvent event) throws MuleException {
MuleMessage message = event.getMessage();
System.out.println("SPlitterAggregator.process(): my_key value: "+ message.getOutboundProperty("my_key"));
Statement statement = (Statement) message.getPayload();
System.out.println("SPlitterAggregator.process(): Statement: "+statement.toString());
return super.process(event);
}
我的目的是访问在客户端中设置的属性“my_key”,并在SplitterAggregator.process()方法中访问它。 它打印为null。
在这个版本中,我创建了DefaultMessage并将“my_key”属性设置为会话范围。
String applicationDataAsXml = "<DocumentJournal>...........</DocumentJournal>";
MuleClient muleClient = MuleClientSingleton.getMuleClient();
try {
DefaultMuleMessage message = new DefaultMuleMessage(applicationDataAsXml, muleClient.getMuleContext());
message.setSessionProperty("my_key", "my_value");
muleClient.sendAsync("vm://statementRequest", message);
}catch(Exception e) {
e.printStackTrace();
}
当我运行上述版本的客户端代码时,我得到java.lang.IllegalStateException:只有所有者线程可以写入消息:
有人可以让我知道如何使用属性。
由于 Venkat
答案 0 :(得分:3)
您的第一个客户端代码大多是正确的,但使用以下代码而不是sendAsync(仅当您的端点端点是请求 - 响应时才有意义):
muleClient.dispatch("vm://statementRequest", applicationDataAsXml, props);
现在您需要了解消息属性范围的概念。为此,我建议您阅读http://www.mulesoft.org/documentation/display/MULE3USER/Message+Property+Scopes
然后考虑你的流程:
为什么有这么多VM端点和流量?如果您需要重用,请考虑使用子流和流引用而不是VM端点,否则准备好处理跨范围的属性复制(通过标准的message-properties-transformer)......