#java #mule #mule-component #anypoint-studio
#java #mule #mule-component #anypoint-studio
Вопрос:
Почему я не вижу ошибок, которые происходят в компоненте java в файле журнала Mule? Более того, допустим, у меня есть system.out.print в java, как я могу увидеть вывод в файле журнала?
Комментарии:
1. Что говорится в документации? docs.mulesoft.com/mule-user-guide/v/3.7/logging-in-mule ? Вы пробовали какие-то предварительные исследования? Для вещей, идущих в system.out … Я сомневаюсь, что они отображаются в каком-либо файле журнала; если только вам не удастся ввести какой-то код, который принудительно изменяет, куда собирается System.out .
Ответ №1:
Я предполагаю, что вы пишете свой собственный Java-компонент, который реализует callable.
Чтобы записать что-то в журналы из компонента Java, вам нужно получить регистратор, такой как :
final static Logger logger = Logger.getLogger(MyCallableClass.class);
см https://www.mkyong.com/logging/log4j-hello-world-example /
Затем из ваших функций вы можете создать запись в журнале, например:
logger.error("This is an example of a log entry with Error Level.");
Что касается вашего другого вопроса, если вы не используете блок try catch в своем компоненте, исключения, создаваемые в вашем компоненте, должны распространяться на поток mule, однако в журналах Mule вы также увидите, что исключение было вызвано компонентом Java.
Я бы посоветовал вам приложить больше информации о том, что делает ваш компонент Java, вместе с журналами, чтобы мы могли лучше понять, что вы испытываете.
Тем не менее, я создал краткий пример (см. Ниже), чтобы помочь вам. Когда вы запускаете и нажимаете конечную точку http, вы должны увидеть сообщение, напечатанное в регистраторе как ошибка из компонента, затем генерируется пользовательское исключение, и оно перехватывается в блоке стратегии исключения catch, который соответствует нашему выражению :
Поток:
<flow name="flow-that-calls-component-with-exception">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8089" doc:name="HTTP" />
<component class="com.example.MyCallableClass" doc:name="Java" />
<choice-exception-strategy>
<catch-exception-strategy when="exception.causedBy(com.example.MyCustomException)">
<logger level="ERROR" message="My Custom Exception was thrown" />
<set-payload value="My Custom Exception was thrown." />
</catch-exception-strategy>
<catch-exception-strategy>
<logger level="ERROR" message="Another exception was thrown" />
<set-payload value="Another exception was thrown." />
</catch-exception-strategy>
</choice-exception-strategy>
</flow>
Компонент Java:
package com.example;
import org.apache.log4j.Logger;
import org.mule.api.MuleEventContext;
import org.mule.api.lifecycle.Callable;
public class MyCallableClass implements Callable {
final static Logger logger = Logger.getLogger(MyCallableClass.class);
@Override
public Object onCall(MuleEventContext eventContext) throws Exception {
logger.error("This is an example of a log entry with Error Level.");
//Our Java component will throw an exception so that we can see that we can catch it in a flow
throw new MyCustomException();
// throw new Exception("This is an exception that will be thrown in a flow");
// return eventContext.getMessage().getPayload();
}
}
Пользовательское исключение:
package com.example;
public class MyCustomException extends Exception {
/**
*
*/
private static final long serialVersionUID = -5738957517051661541L;
}
Ответ №2:
Если вы хотите отправить данные в стандартный ввод / вывод. Соединитель позволяет записывать данные в системные потоки JAVA и из них для отладки. Это не рекомендуется в рабочей среде.
Этот URL содержит информацию и образец.
В реальном сценарии вам потребуется настроить пакет logger для управления протоколированием. Это может быть, например, log4j2, который используется в mule