当前位置: 首页 > 知识库问答 >
问题:

Spring integration DSL在Java1.7中创建邮件出站通道适配器

轩辕翰
2023-03-14
@MessagingGateway
interface MailGateWay{
@Gateway(requestChannel = "fromChannel")
public void sendMail(MessageDto msgDto) ;
}

@Bean
public QueueChannel fromChannel(){
    return new QueueChannel();
}

@Bean
public JavaMailSenderImpl mailSender() {
    JavaMailSenderImpl mail = new JavaMailSenderImpl();
    Properties javaMailProperties = new Properties();
    mail.setHost(host);
    mail.setPort(port);
    mail.setUsername(username);
    mail.setPassword(password);
    mail.setDefaultEncoding("UTF-8");
    javaMailProperties.setProperty("mail.transport.protocol", "smtp");
    javaMailProperties.setProperty("mail.smtp.auth", String.valueOf(true));
    javaMailProperties.setProperty("mail.smtp.starttls.enable", String.valueOf(false));
    javaMailProperties.setProperty("mail.debug", String.valueOf(true));
    mail.setJavaMailProperties(javaMailProperties);
    return mail;
}

Now my Transfrmer looks loke this, I have created a transformer bean in my dsl

@Bean
@Scope("prototype")
public MailMessageTransformer mailTransformer(){
    return new MailMessageTransformer();
}

@Bean
public QueueChannel outboundMailChannel(){
    return new QueueChannel();
}
public class MailMessageTransformer {

@Autowired
private JavaMailSender mailSender;

public MimeMessage transform(final MessageDto mailDto) {        

    if (mailDto == null) {
        return null;
    }

    if (mailDto.getEncoding() == null) {
        mailDto.setEncoding(IMailConstants.DEFAULT_ENCODING);
    }       

    mailDto.setText(mailDto.getText().replaceAll(System.lineSeparator(), IMailConstants.HTML_NEW_LINE));

    MimeMessage mimeMessage = null;
    try {
        mimeMessage = mailSender.createMimeMessage();
        MimeMessageHelper message = new MimeMessageHelper(mimeMessage);
        message.setTo(mailDto.getTo());
        message.setFrom(mailDto.getFrom());
        message.setSubject(mailDto.getSubject());
        message.setText(getMailContent(mailDto), IMailConstants.TRUE);
        message.setSentDate(new Date(System.currentTimeMillis()));


        if (null != mailDto.getBcc()) {
            message.setBcc(mailDto.getBcc());
        }
        if (null != mailDto.getBcc()) {
            message.setCc(mailDto.getCc());
        }
        if (null != mailDto.getReplyTo() && !mailDto.getReplyTo().isEmpty()) {
            message.setReplyTo(mailDto.getReplyTo());
        }

    }
    catch (MessagingException msgex) {
        LOG.error("MailMessageTransformer.transformMime.Exception::: MessagingException", msgex);

    }
     catch (MailException mailex) {
            LOG.error("MailMessageTransformer.transformMime.Exception::: MailException ", mailex);

        }

    catch (Exception ex) {
        LOG.error("MailMessageTransformer.transformMime.Exception::: Exception", ex);

    }

    LOG.debug("MailMessageTransformer.transformMime.mimeMessage:::" + mimeMessage);
    return mimeMessage;
}
}
<int:transformer input-channel="fromChannel"
output-channel="outboundMailChannel" ref="mailTransformer" method="transform">
<int:poller fixed-rate="6000" max-messages-per-poll="10" />
<int-mail:outbound-channel-adapter
    channel="outboundMailChannel" mail-sender="mailSender" />

流是Gateway-->RequsetChannel-->Transform-->OutboundMailChannl-->MailSender(MailAdapter)

共有1个答案

汪信鸥
2023-03-14

对不起,你的问题不是很清楚。更重要的是,您没有显示流定义。加上你的自定义变压器。

另一方面,您总是可以将.transform()用于任何自定义转换器实现,该实现指定为@bean,甚至类似于private方法来返回其实例。DSL将关注CTX中的bean种群。

请注意,DSL提供了邮件通信所需的一切。

还有一点。不要忘记,您甚至可以用@requestmapping标记@gateway方法,以绕过controller级别。

对不起,我真的不知道该怎么帮你...

更新

查看您的代码,我真的没有看到任何问题,除非我没有看到在MailMessageTransformer@bean中使用@scope(“prototype”)的原因。

@Bean
public IntegrationFlow emailFlow() {
    return IntegrationFlows
            .from(fromChannel())
            .transform(mailTransformer(),
                new Consumer<GenericEndpointSpec<MessageTransformingHandler>>() {

                    @Override
                    public void accept(GenericEndpointSpec<MessageTransformingHandler> spec) {
                        spec.poller(Pollers.fixedRate(6000).maxMessagesPerPoll(10));
                    }

            })
            .handle(new MailSendingMessageHandler(this.mailSender))
            .get();
    }
 类似资料:
  • 那么如何将上面的xml代码转换为类似的DSL特定代码呢?

  • 问题内容: Spring Integration FTP中的入站通道适配器和出站通道适配器之间有什么区别?我应该使用哪一个?何时使用? 我从文档中了解到,出站可以发送任何类型的文件(例如byte [],String,java.io.File),但入站仅限于文件类型。那仅仅是区别还是其他? 问题答案: 我建议您首先阅读理论 。 任何Inbound适配器都旨在从外部系统获取数据。Outbound-放置

  • 我有一个模型对象,它是在多次转换和解析之后填充的。现在,我需要使用spring集成将模型中的消息属性发送给kafka。我可以使用messageKey方法构造键,但如何从m.getPayload()之类的模型中获取实际消息。getMessage()并将其发送给Kafka。

  • 问题内容: 入站和出站通道适配器之间的根本区别是什么? 任何示例都将非常有帮助。 我已经查看过Spring文档,这种“方向性”的区别对我来说还不清楚。我支持配置了outbound-channel-adapter的应用程序,但是我发现使用 出站 标签可以直观地了解行为计数器。该适配器获取一个外部文件,然后 将其 引入应用程序中, 在 该应用程序中我们解析文件并保留数据。 这类似于这个问题,但是我想更