Использование свойств сообщения Mule - PullRequest
2 голосов
/ 25 октября 2011

Доброе утро, я пытаюсь установить свойство и получить доступ к нему. Но не удалось получить доступ к набору свойств. Я пытался получить доступ к свойству в 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 в качестве реквизита, поместил свойство с именем «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 с областью действия сеанса.

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

1 Ответ

3 голосов
/ 25 октября 2011

Ваш первый клиентский код в основном корректен, но вместо sendAsync используется следующее (что имеет смысл, только если конечной точкой вашей конечной точки является запрос-ответ):

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

Теперь вам нужно понять понятие область свойств сообщения .Для этого я предлагаю вам прочитать http://www.mulesoft.org/documentation/display/MULE3USER/Message+Property+Scopes

Затем рассмотрите ваши потоки:

  • вы установили my_key в сообщении и отправили его на первую конечную точку виртуальной машиныв StatementRequestFlow ,
  • при получении сообщения в StatementRequestFlow , my_key находится во входящей области,
  • вы отправляетесообщение для StatementSplitFlow через конечную точку виртуальной машины StatementSplit , но не копировать свойство my_key из входящей в исходящую область: следовательно, оно потеряно,
  • в StatementSplitFlow вы выполняете вторую отправку StatementResponseFlow через еще одну конечную точку ВМ, нет никакой надежды на то, что my_key когда-либо достигнет вашего сплиттера ...

Почему так много конечных точек и потоков ВМ?Если вас беспокоит повторное использование, рассмотрите возможность использования подпотоков и ссылок на потоки вместо конечных точек ВМ, в противном случае приготовьтесь к копированию свойств по всем областям (через стандартный преобразователь свойств-сообщений) ...

...