将Apache骆驼消息类型更改为InOut

时间:2018-06-20 07:26:54

标签: apache-camel

据我了解,InOut消息是可以从目标接收响应的消息。

但是,我还找不到任何有关如何将消息转换为InOut类型以及如何从目标访问响应的示例

例如,给定一条路线,例如:

from("direct:start").to("smtps://smtp.gmail.com:465?username=user@gmail.com&password=usrpw&to=address@gmail.com")
  • 如何将路由到smtps组件的消息转换为InOut类型?
  • 我可以期望来自smtp组件的响应吗,例如表示邮件已成功发送?
  • 如何获取此回复?

1 个答案:

答案 0 :(得分:0)

默认情况下,每个“ .to(uri)”都位于InOut中。下一步中的正文将由InOut目标的响应替换。例如,在HTTP组件中,如果您具有以下路由:

from(direct:start)
  .to(http://...)
  .log(INFO, "${body}")

将记录对http呼叫的响应。

如果您在文档中找不到很好的信息,强烈建议您检查相关生产者的代码,以了解返回的信息或可以使用的信息。

  

https://github.com/apache/camel

例如,对于SMTP,我还没有找到文档说明主体发生了什么,但是代码非常清楚:

    public void process(final Exchange exchange) {
    ClassLoader tccl = Thread.currentThread().getContextClassLoader();
    try {
        ClassLoader applicationClassLoader = getEndpoint().getCamelContext().getApplicationContextClassLoader();
        if (applicationClassLoader != null) {
            Thread.currentThread().setContextClassLoader(applicationClassLoader);
        }

        MimeMessage mimeMessage;

        final Object body = exchange.getIn().getBody();
        if (body instanceof MimeMessage) {
            // Body is directly a MimeMessage
            mimeMessage = (MimeMessage) body;
        } else {
            // Create a message with exchange data
            mimeMessage = new MimeMessage(sender.getSession());
            getEndpoint().getBinding().populateMailMessage(getEndpoint(), mimeMessage, exchange);
        }
        if (LOG.isDebugEnabled()) {
            LOG.debug("Sending MimeMessage: {}", MailUtils.dumpMessage(mimeMessage));
        }
        sender.send(mimeMessage);
        // set the message ID for further processing
        exchange.getIn().setHeader(MailConstants.MAIL_MESSAGE_ID, mimeMessage.getMessageID());
    } catch (MessagingException e) {
        exchange.setException(e);
    } catch (IOException e) {
        exchange.setException(e);
    } finally {
        Thread.currentThread().setContextClassLoader(tccl);
    }
}

您的交换将具有带有MAIL_ID(“ CamelMailMessageId”)的标头,并且在发生任何消息传递异常的情况下,该异常将被传播。即使是InOut,身体似乎也没有动过。