【Spring Integration】入门示例2例:读取文件并

2023-01-24  本文已影响0人  伊丽莎白2015

【官网】

【本文示例】

1. 示例-1:将source文件夹中的文件自动复制到destination文件夹中

【示例参考】

1.1 依赖

需要引入spring boot parent,我用的是2.7.0版本。这个版本的spring boot,相应引入的spring-integration版本为5.5.12。
下述的spring-integration-file主要是示例中需要操作file。

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-integration</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-file</artifactId>
        </dependency>
    </dependencies>
1.2 核心代码,创建两个bean
@Configuration
@EnableIntegration
public class SpringIntegrationConfig {

    String folder = "/Users/xx/IdeaProjects/spring-integration-test/src/main";

    @Bean
    @InboundChannelAdapter(value = "fileInputChannel", poller = @Poller(fixedDelay = "1000"))
    public MessageSource<File> fileReadingMessageSource() {
        CompositeFileListFilter<File> filter = new CompositeFileListFilter<>();
        filter.addFilter(new SimplePatternFileListFilter("*.txt"));

        FileReadingMessageSource readerSource = new FileReadingMessageSource();
        readerSource.setDirectory(new File(folder + "/resources/source"));
        readerSource.setFilter(filter);
        return readerSource;
    }

    @Bean
    @ServiceActivator(inputChannel = "fileInputChannel")
    public MessageHandler fileWritingMessageHandler() {
        FileWritingMessageHandler writerHandler =
                new FileWritingMessageHandler(new File(folder + "/resources/destination"));
        writerHandler.setAutoCreateDirectory(true);
        writerHandler.setExpectReply(false);
        return writerHandler;
    }
1.3 测试
首先在resources目录下新建source文件夹,并放一些测试文件: image.png

启动SpringIntegrationApplication,从日志可以看到创建了channel=fileInputChannel,并且该channel有一个订阅者:

2022-11-27 21:59:36.722 INFO 37452 --- [ main] o.s.i.endpoint.EventDrivenConsumer : Adding {file:outbound-channel-adapter:springIntegrationConfig.fileWritingMessageHandler.serviceActivator} as a subscriber to the 'fileInputChannel' channel
2022-11-27 21:59:36.722 INFO 37452 --- [ main] o.s.integration.channel.DirectChannel : Channel 'application.fileInputChannel' has 1 subscriber(s).

启动后可以看到文件test.txt被自动复制到了destination文件夹中: image.png

2. 示例-2:通过spring-integration,发送email

【参考】

【官方文档】

2.1 依赖

和#1一样,需要引入spring boot parent,我用的是2.7.0版本。上述的spring-boot-starter-integration也需要引入。除此之外,还需要引入mail相关的依赖:

<dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4</version>
        </dependency>

        <dependency>
            <groupId>com.github.kirviq</groupId>
            <artifactId>dumbster</artifactId>
            <version>1.7.1</version>
            <scope>test</scope>
        </dependency>
</dependency>
2.2 Mail相关配置:

新建配置文件:smtp.properties

smtp.host=localhost
smtp.port=12345
2.3 核心代码:创建三个bean
@Configuration
@PropertySource("classpath:/smtp.properties")
public class MailConfig {

    @Value("${smtp.host}")
    private String smptHost;

    @Value("${smtp.port}")
    private Integer smtpPort;

    @Bean
    public JavaMailSenderImpl mailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost(smptHost);
        mailSender.setPort(smtpPort);
        return mailSender;
    }

    @Bean
    public MessageChannel smtpChannel() {
        return new DirectChannel();
    }

    @ServiceActivator(inputChannel = "smtpChannel", outputChannel = "nullChannel")
    public MessageHandler mailsSenderMessagingHandler (Message<MailMessage> message) {
        MailSendingMessageHandler mailSendingMessageHandler = new MailSendingMessageHandler(mailSender());
        mailSendingMessageHandler.handleMessage(message);
        return mailSendingMessageHandler;
    }
}

【测试】

@Slf4j
@SpringBootTest
public class MailTest {

    @Autowired
    MessageChannel smtpChannel;

    @Test
    public void mailsend() throws IOException {
        SimpleSmtpServer mailServer = SimpleSmtpServer.start(12345);
        smtpChannel.send(new GenericMessage<>(buildMailMessage("Test 1", "content 1")));
        mailServer.stop();

        log.info("email send successfully..............");
        List<SmtpMessage> messagesSent = mailServer.getReceivedEmails();
        Assertions.assertEquals(1, messagesSent.size());

        log.info("received body: {}", messagesSent.get(0).getBody());
    }

    private MailMessage buildMailMessage(String subject, String content){
        MailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setTo("test-to@com.test");
        mailMessage.setFrom("noreply@com.test");
        mailMessage.setCc("test-cc@com.test");
        mailMessage.setText(content);
        mailMessage.setSubject(subject);
        return mailMessage;
    }
}
上一篇下一篇

猜你喜欢

热点阅读