9.3 创建email 集成流
9.3 创建email 集成流
在本节中,将实现一个集成信息流,用于轮询
下一步,在集成信息流中,电子邮件将被解析为订单对象,接着被扇出到另外一个向
@Data
@ConfigurationProperties(prefix="tacocloud.email")
@Component
public class EmailProperties {
private String username;
private String password;
private String host;
private String mailbox;
private long pollRate = 30000;
public String getImapUrl() {
return String.format("imaps://%s:%s@%s/%s",
this.username, this.password, this.host, this.mailbox);
}
}
正如你所看到的,
该
tacocloud:
email:
host: imap.tacocloud.com
mailbox: INBOX
username: taco-in-flow
password: 1L0v3T4c0s
poll-rate: 10000
现在让我们使用
定义这个流程时有两种选择:
- 定义在
Taco Cloud 应用程序本身里面 – 在流结束的位置,服务激活器将调用定义了的存储库来创建taco 订单。 - 定义在一个单独的应用程序中 – 在流结束的位置,服务激活器将发送
POST 请求到Taco Cloud API 来提交taco 订单。
无论选择那种服务激活器的实现,对流本身没有什么影响。但是,因为你会需要一些类型来代表的
还可以选择使用
程序清单
package tacos.email;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.dsl.IntegrationFlow;
import org.springframework.integration.dsl.IntegrationFlows;
import org.springframework.integration.dsl.Pollers;
@Configuration
public class TacoOrderEmailIntegrationConfig {
@Bean
public IntegrationFlow tacoOrderEmailFlow(
EmailProperties emailProps,
EmailToOrderTransformer emailToOrderTransformer,
OrderSubmitMessageHandler orderSubmitHandler) {
return IntegrationFlows
.from(
Mail.imapInboundAdapter(emailProps.getImapUrl()),
e -> e.poller(
Pollers.fixedDelay(emailProps.getPollRate())))
.transform(emailToOrderTransformer)
.handle(orderSubmitHandler)
.get();
}
}
-
IMAP 电子邮件入站信道适配器 —— 根据EmailProperties 的getImapUrl() 方法返回的IMP URL 来创建通道适配器,根据pollRate 属性来设定轮询延时。进来的电子邮件被移交到它连接到转换器的通道。 -
一种将电子邮件转换为订单对象的转换器 —— 在
EmailToOrderTransformer 中实现的转换器,其被注入到tacoOrderEmailFlow() 方法中。从转换中所产生的订单通过另外一个通道扇出到最终组件中。 -
* 处理程序(作为出站通道适配器)—— 处理程序接收一个订单对象,并将其提交到Taco Cloud 的REST API 。
可以通过将
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-file</artifactId>
</dependency>
程序清单
@Component
public class EmailToOrderTransformer extends AbstractMailMessageTransformer<Order> {
@Override
protected AbstractIntegrationMessageBuilder<Order>
doTransform(Message mailMessage) throws Exception {
Order tacoOrder = processPayload(mailMessage);
return MessageBuilder.withPayload(tacoOrder);
}
...
}
在
package tacos.email;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
@Data
public class Order {
private final String email;
private List<Taco> tacos = new ArrayList<>();
public void addTaco(Taco taco) {
this.tacos.add(taco);
}
}
与用于在客户的整个交付和账单信息不同,这个
将电子邮件解析为
该
程序清单
package tacos.email;
import java.util.Map;
import org.springframework.integration.handler.GenericHandler;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
@Component
public class OrderSubmitMessageHandler
implements GenericHandler<Order> {
private RestTemplate rest;
private ApiProperties apiProps;
public OrderSubmitMessageHandler(
ApiProperties apiProps, RestTemplate rest) {
this.apiProps = apiProps;
this.rest = rest;
}
@Override
public Object handle(Order order, Map<String, Object> headers) {
rest.postForObject(apiProps.getUrl(), order, String.class);
return null;
}
}
为了满足
@Data
@ConfigurationProperties(prefix="tacocloud.api")
@Component
public class ApiProperties {
private String url;
}
在
tacocloud:
api:
url: http://api.tacocloud.com
为了使
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
这使得
spring:
main:
web-application-type: none