gpt4 book ai didi

mule - Mule 消息属性的使用

转载 作者:行者123 更新时间:2023-12-04 06:10:03 25 4
gpt4 key购买 nike

早上好,我正在尝试设置一个属性并访问它。但无法访问属性集。
我试图访问从客户端设置的 SplitterAggregator 中的属性。
以下是骡子配置。

<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 作为 Prop ,并按名称“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() 方法中访问它。
它打印为空。

以下是客户端代码的第二个版本:

在这个版本中,我创建了 DefaultMessage 并将“my_key”属性设置为 session 范围。
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: Only owner thread can write to message:

有人可以让我知道如何使用属性。

谢谢
文卡特

最佳答案

您的第一个客户端代码大部分是正确的,但使用以下代码而不是 sendAsync (仅当您的端点端点是请求响应时才有意义):

muleClient.dispatch("vm://statementRequest", applicationDataAsXml, props);

现在你需要理解 的概念。消息属性范围 .为此,我建议您阅读 http://www.mulesoft.org/documentation/display/MULE3USER/Message+Property+Scopes

然后考虑您的流程:
  • 你设置我的 key 在消息上并将其分派(dispatch)到 statementRequestFlow 中的第一个 VM 端点,
  • 当消息到达 statementRequestFlow 时,我的 key 在入站范围内,
  • 您通过 statementSplit VM 端点将消息发送到 statementSplitFlow,但不要复制 我的 key 从入站到出站范围的属性:因此丢失,
  • 在 statementSplitFlow 中,您通过另一个 VM 端点对 statementResponseFlow 进行第二次分派(dispatch),完全没有希望 我的 key 曾经到达您的分离器...

  • 为什么有这么多 VM 端点和流?如果您关心重用,请考虑使用子流和流引用而不是 VM 端点,否则准备好处理跨范围的属性复制(通过标准消息属性转换器)...

    关于mule - Mule 消息属性的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7883024/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com