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

Spring integration Spring集成DSL在Java1.7中创建邮件出站通道适配器,spring-integration,Spring Integration,我正在为dsl中的邮件出站通道创建一个特定流 我的流程是这样的,我通过消息网关从rest服务发送邮件,然后消息将通过请求通道 对于我自己的自定义转换器,在转换后,消息将通过out put通道进入出站适配器。 因为我的transformer是一个单独的类,所以无法在dsl中为我的整个流编写集成流。能提供任何一个吗 任何指向它的指针,因为我无法继续 这是我的DSL类,包含邮件网关和邮件发送者bean @MessagingGateway interface MailGateWay{ @Gateway(

我正在为dsl中的邮件出站通道创建一个特定流 我的流程是这样的,我通过消息网关从rest服务发送邮件,然后消息将通过请求通道 对于我自己的自定义转换器,在转换后,消息将通过out put通道进入出站适配器。 因为我的transformer是一个单独的类,所以无法在dsl中为我的整个流编写集成流。能提供任何一个吗 任何指向它的指针,因为我无法继续

这是我的DSL类,包含邮件网关和邮件发送者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();
}
这是我的自定义MailMessageTransformer类,我需要调用这个transform(),它将返回一个mimessage

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并添加一个轮询器,如下面的xml

<int:transformer input-channel="fromChannel"
output-channel="outboundMailChannel" ref="mailTransformer" method="transform">
<int:poller fixed-rate="6000" max-messages-per-poll="10" />



流程为网关-->请求使用通道-->转换-->OutboundMailChannl-->mailSender(MailAdapter)

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

从另一方面来说,您总是可以将
.transform()
用于指定为
@Bean
的任何自定义
转换器
实现,甚至像
私有
方法一样返回其实例。DSL将关注ctx中的bean数量

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

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

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

更新

查看您的代码,我真的看不到任何问题,除非我看不到为
MailMessageTransformer
@Bean
使用
@Scope(“原型”)

用XML术语表示的集成流程非常简单。我不清楚你在哪里有交通堵塞:

@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();
    }
@Bean
公共集成流emailFlow(){
返回积分流
.from(fromChannel())
.transform(mailTransformer(),
新消费者(){
@凌驾
public void accept(GenericEndpointSpec){
规范轮询器(轮询器固定速率(6000).maxMessagesPerPoll(10));
}
})
.handle(新的MailSendingMessageHandler(this.mailSender))
.get();
}

Hi Artem,我已经编辑了我的原始问题并描述了我的流程以实现我的目标,因此请您提供任何关于这一点的指针。感谢Artem,这样做transform()会给我带来编译错误。哦!很抱歉我错过了您的
MailMessageTransformer
没有实现
Transformer
。您是否介意将其设置为
AbstractPayloadTransformer
?另一方面,由于
DSL-1.1
我们为这种情况提供了
transform(Object service,String methodName)
EIP方法。嗨,阿泰姆,我还有一个疑问,因为在xml中,我们提供了两个通道(输入和输出通道),所以在我们的DSL中,我们应该需要它,因为通过输出通道我们将消息发送到适配器。但是在dsl中,我们没有使用邮件出站适配器。我的MailMessageTransformer类应该为此扩展AbstractPayloadTransformer。
@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();
    }