首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring集成DSL在java 1.7中创建邮件出站通道适配器

Spring集成DSL在java 1.7中创建邮件出站通道适配器
EN

Stack Overflow用户
提问于 2015-08-20 14:32:32
回答 1查看 1.3K关注 0票数 1

我正在为dsl中的邮件外绑定通道创建一个特定的流--我的流程是这样的,我通过消息GateWay从rest服务发送一封邮件,然后消息将通过请求通道发送到我自己的自定义转换器,在对消息进行遍历之后,消息将转到出站适配器彻底的一个输出通道上。因为我的转换器是一个单独的类,所以不能用dsl为我的整个流编写集成流。请提供任何指向它的指针,因为我无法继续。

这是我的DSL类,包含邮件网关和mailSender bean。

代码语言:javascript
复制
@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();
}

这是我的自定义MailMessageTransformer类,我需要调用这个transform(),它返回一个MimeMessage。

代码语言:javascript
复制
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;
}
}

现在,我需要创建一个dsl流,通过这个流程,我可以调用我的mailTransformer() bean并添加一个轮询器,如下所示。

代码语言:javascript
复制
<int:transformer input-channel="fromChannel"
output-channel="outboundMailChannel" ref="mailTransformer" method="transform">
<int:poller fixed-rate="6000" max-messages-per-poll="10" />

代码语言:javascript
复制
<int-mail:outbound-channel-adapter
    channel="outboundMailChannel" mail-sender="mailSender" />

流程是Gateway-->RequsetChannel--->Transform--->OutboundMailChannl--->mailSender(MailAdapter)

EN

回答 1

Stack Overflow用户

发布于 2015-08-20 14:39:40

抱歉,你的问题还不太清楚。更重要的是,你没有给出流程的定义。再加上你的定制变压器。

另一方面,您始终可以对任何被指定为.transform()的自定义Transformer实现使用@Bean,甚至可以像private方法一样返回其实例。DSL将在ctx中关注豆类种群。

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

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

抱歉,我真的不知道怎么帮你.

更新

从您的代码来看,我确实没有看到任何问题,除非我没有看到将@Scope("prototype")用于MailMessageTransformer @Bean的原因。

您的XML术语集成流程非常简单。我不清楚你在哪里拥堵:

代码语言:javascript
复制
@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();
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32121072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档