1
votes

I am creating a specific flow for mail out bound channel in dsl My flow is like this, I am sending a mail from a rest service through a Message GateWay then the message will go through a request channel to my own customize transformer, after transerming the message will go to the outbound adapter thorough a out put channel. As my transformer is a separate class so not able to write a integration flow in dsl for my entire flow. Can any ony one please provide any pointer to it as I am not able to proceed.

This is my DSL class contains mail gateway and mailSender bean.....

@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();
}

And this is my custom MailMessageTransformer class and I need to call this transform() which is returning a MimeMessage.

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;
}
}

Now I need to create a dsl flow through which I can call my mailTransformer() bean and add a poller like the below xml.

<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" />

The flow is Gateway-->RequsetChannel--->Transform--->OutboundMailChannl--->mailSender(MailAdapter)

1

1 Answers

1
votes

Sorry, your question isn't fully clear. And even more you don't show the flow definition. Plus that your custom transformer.

From other side you always can use .transform() for any custom Transformer implementation which is specified as @Bean or even like a private method to return its instance. The DSL will take care about bean population in the ctx.

And pay attention that DSL provides everything what you need for Mail communication.

And one more point. Don't forget that you even can mark your @Gateway method with the @RequestMapping to bypass the controller level.

Sorry, I'm really not sure how to help you...

UPDATE

Looking to your code I really don't see any issues, unless I don't see the reason to use @Scope("prototype") for the MailMessageTransformer @Bean.

And your integration flow in XML terms is very simple. It isn't clear to me where you have a congestion:

@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();
    }