作者 [wgf]

亚马逊订单数据同步(非主键)

... ... @@ -30,6 +30,26 @@
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
... ...
... ... @@ -28,7 +28,7 @@ public class AmazonOrderItemListener {
@Autowired
AmazonOrderItemService amazonOrderItemService;
@RabbitListener(queues = "polaris_order_center.amazon_order_item")
@RabbitListener(queues = "polaris_order_center.amazon_order_item.by")
public void receive(String message, Channel channel, Message messageEntity) throws IOException {
try {
... ... @@ -38,8 +38,6 @@ public class AmazonOrderItemListener {
EventType eventType = EventType.valueOf(messageVo.getType());
log.info("当前监听binlog 数据库:{}, 数据表:{}, 数据:{}", messageVo.getDatabase(), messageVo.getTable(), message);
// 数据同步只关注这三种事件
switch (eventType) {
case INSERT:
... ...
... ... @@ -3,7 +3,6 @@ package com.aukey.example.listener;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.aukey.example.constant.EventType;
import com.aukey.example.constant.MQConst;
import com.aukey.example.entity.fbaStock.AmazonOrder;
import com.aukey.example.service.fbaStock.AmazonOrderService;
import com.aukey.example.vo.MessageVo;
... ... @@ -28,7 +27,7 @@ public class AmazonOrderListener {
@Autowired
AmazonOrderService amazonOrderService;
@RabbitListener(queues = "polaris_order_center.amazon_order")
@RabbitListener(queues = "polaris_order_center.amazon_order.by")
public void receive(String message, Channel channel, Message messageEntity) throws IOException {
try {
... ... @@ -38,8 +37,6 @@ public class AmazonOrderListener {
EventType eventType = EventType.valueOf(messageVo.getType());
log.info("当前监听binlog 数据库:{}, 数据表:{}, 数据:{}", messageVo.getDatabase(), messageVo.getTable(), message);
// 数据同步只关注这三种事件
switch (eventType) {
case INSERT:
... ...
package com.aukey.example.listener;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.aukey.example.constant.EventType;
import com.aukey.example.constant.MQConst;
import com.aukey.example.entity.AmazonOrder;
import com.aukey.example.vo.MessageVo;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.io.IOException;
/**
* @author: wgf
* @create: 2020-06-09 14:30
* @description: CanalUser监听器
**/
@Slf4j
@Component
public class CanalUserListener {
@RabbitListener(queues = "polaris_order_center.amazon_order")
public void receive(String message, Channel channel, Message messageEntity) throws IOException {
try {
log.info("接收到队列: {} 消息:{}", MQConst.TEST, message);
MessageVo<AmazonOrder> messageVo = JSON.parseObject(message, new TypeReference<MessageVo<AmazonOrder>>() {
});
EventType eventType = EventType.valueOf(messageVo.getType());
log.info("当前监听binlog 数据库:{}, 数据表:{}", messageVo.getDatabase(), messageVo.getTable());
// 数据同步只关注这三种事件
switch (eventType) {
case INSERT:
log.info("触发 INSERT 事件");
// messageVo.getData(); 获取数据变更
// TODO 自定义实现
break;
case UPDATE:
log.info("触发 UPDATE 事件");
// TODO 自定义实现
break;
case DELETE:
log.info("触发 DELETE 事件");
// TODO 自定义实现
break;
default:
log.info("其他事件类型:{}, 过滤不处理", eventType);
}
log.info("消息长度:{}", messageVo.getData().size());
/**
* 消息消费确认
* 如果客户端在线没有签收没有签收这条Message,则此消息进入Unacked状态,此时监听器阻塞等待消息确认,不推送新Message
* 如果待消息确认并且客户端下线,下次客户端上线重新推送上次Unacked状态Message
*/
channel.basicAck(messageEntity.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
/**
* 第一个参数deliveryTag:发布的每一条消息都会获得一个唯一的deliveryTag,deliveryTag在channel范围内是唯一的
* 第二个参数multiple:批量确认标志。如果值为true,包含本条消息在内的、所有比该消息deliveryTag值小的 消息都被拒绝了(除了已经被 ack 的以外);如果值为false,只拒绝三本条消息
* 第三个参数requeue:表示如何处理这条消息,如果值为true,则重新放入RabbitMQ的发送队列,如果值为false,则通知RabbitMQ销毁这条消息
*/
//channel.basicNack(messageEntity.getMessageProperties().getDeliveryTag(), false,true);
e.printStackTrace();
}
}
}
... ... @@ -4,4 +4,7 @@ import com.aukey.example.commom.mapper.Mapper;
import com.aukey.example.entity.fbaStock.AmazonOrderItem;
public interface AmazonOrderItemMapper extends Mapper<AmazonOrderItem> {
Integer selectAid(AmazonOrderItem amazonOrderItem);
}
\ No newline at end of file
... ...
... ... @@ -4,4 +4,5 @@ import com.aukey.example.commom.mapper.Mapper;
import com.aukey.example.entity.fbaStock.AmazonOrder;
public interface AmazonOrderMapper extends Mapper<AmazonOrder> {
Integer selectAid(AmazonOrder amazonOrder);
}
\ No newline at end of file
... ...
... ... @@ -3,9 +3,11 @@ package com.aukey.example.service.fbaStock.impl;
import com.aukey.example.entity.fbaStock.AmazonOrderItem;
import com.aukey.example.mapper.fbaStock.AmazonOrderItemMapper;
import com.aukey.example.service.fbaStock.AmazonOrderItemService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
import java.util.List;
import java.util.Objects;
... ... @@ -15,6 +17,7 @@ import java.util.Objects;
* @create: 2020-08-25 14:36
* @description:
**/
@Slf4j
@Service
public class AmazonOrderItemServiceImpl implements AmazonOrderItemService {
... ... @@ -25,19 +28,22 @@ public class AmazonOrderItemServiceImpl implements AmazonOrderItemService {
@Transactional(value = "fbaStockTransactionManager")
public void insertOrUpdate(List<AmazonOrderItem> list) {
for (AmazonOrderItem amazonOrderItem : list) {
log.info("订单号:{}", amazonOrderItem.getAmazonOrderId());
AmazonOrderItem query = new AmazonOrderItem();
query.setAmazonOrderId(amazonOrderItem.getAmazonOrderId());
query.setAccountId(amazonOrderItem.getAccountId());
query.setAreaId(amazonOrderItem.getAreaId());
query.setAmazonOrderId(amazonOrderItem.getAmazonOrderId());
AmazonOrderItem existOrder = this.amazonOrderItemMapper.selectOne(query);
query.setSellerSku(amazonOrderItem.getSellerSku());
query.setOrderItemId(amazonOrderItem.getOrderItemId());
Integer aid = this.amazonOrderItemMapper.selectAid(query);
// 主键和 headId不能使用
amazonOrderItem.setOrderHeaderId(null);
if (Objects.isNull(existOrder)) {
if (Objects.isNull(aid)) {
amazonOrderItem.setAid(null);
this.amazonOrderItemMapper.insertSelective(amazonOrderItem);
} else {
amazonOrderItem.setAid(existOrder.getAid());
amazonOrderItem.setAid(aid);
this.amazonOrderItemMapper.updateByPrimaryKeySelective(amazonOrderItem);
}
}
... ...
... ... @@ -3,9 +3,11 @@ package com.aukey.example.service.fbaStock.impl;
import com.aukey.example.entity.fbaStock.AmazonOrder;
import com.aukey.example.mapper.fbaStock.AmazonOrderMapper;
import com.aukey.example.service.fbaStock.AmazonOrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
import java.util.List;
import java.util.Objects;
... ... @@ -15,6 +17,7 @@ import java.util.Objects;
* @create: 2020-08-25 14:36
* @description:
**/
@Slf4j
@Service
public class AmazonOrderServiceImpl implements AmazonOrderService {
... ... @@ -25,18 +28,19 @@ public class AmazonOrderServiceImpl implements AmazonOrderService {
@Transactional(value = "fbaStockTransactionManager")
public void insertOrUpdate(List<AmazonOrder> list) {
for (AmazonOrder amazonOrder : list) {
log.info("订单号:{}", amazonOrder.getAmazonOrderId());
AmazonOrder query = new AmazonOrder();
query.setAmazonOrderId(amazonOrder.getAmazonOrderId());
query.setAccountId(amazonOrder.getAccountId());
query.setAreaId(amazonOrder.getAreaId());
query.setAmazonOrderId(amazonOrder.getAmazonOrderId());
AmazonOrder existOrder = this.amazonOrderMapper.selectOne(query);
Integer aid = this.amazonOrderMapper.selectAid(query);
// 主键不能使用
if (Objects.isNull(existOrder)) {
if (Objects.isNull(aid)) {
amazonOrder.setAid(null);
this.amazonOrderMapper.insertSelective(amazonOrder);
} else {
amazonOrder.setAid(existOrder.getAid());
amazonOrder.setAid(aid);
this.amazonOrderMapper.updateByPrimaryKeySelective(amazonOrder);
}
}
... ...
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<Property name="PID">????</Property>
<Property name="LOG_EXCEPTION_CONVERSION_WORD">%xwEx</Property>
<Property name="LOG_LEVEL_PATTERN">%5p</Property>
<Property name="LOG_PATTERN">%clr{%d{MM-dd HH:mm:ss}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{${sys:PID}}{magenta} %clr{-}{faint} %clr{[%t]}{faint} %clr{%c{1}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="${LOG_PATTERN}" />
</Console>
<RollingFile name="RollingFileInfo" fileName="logs/info.log"
filePattern="logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="350 MB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileError" fileName="logs/error.log"
filePattern="logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="350 MB"/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="org.apache.catalina.startup.DigesterFactory" level="error" />
<Logger name="org.apache.catalina.util.LifecycleBase" level="error" />
<Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
<logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
<Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" />
<Logger name="org.crsh.plugin" level="warn" />
<logger name="org.crsh.ssh" level="warn"/>
<Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error" />
<Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
<logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration" level="warn"/>
<logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
<logger name="org.thymeleaf" level="warn"/>
<!-- 打印sql -->
<!--<logger name="com.aukey.example.mapper" level="DEBUG"/> -->
<Root level="INFO">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFileInfo" />
<AppenderRef ref="RollingFileError" />
</Root>
</Loggers>
</Configuration>
... ...
... ... @@ -59,4 +59,14 @@
<result column="title" jdbcType="LONGVARBINARY" property="titleAlias" />
<result column="gift_message_text" jdbcType="LONGVARBINARY" property="giftMessageText" />
</resultMap>
<select id="selectAid" resultType="java.lang.Integer">
select aid
from amazon_order_item
where amazon_order_id = #{amazonOrderId}
and account_id = #{accountId}
and area_id = #{areaId}
and seller_sku = #{sellerSku}
and order_item_id = #{orderItemId}
</select>
</mapper>
\ No newline at end of file
... ...
... ... @@ -60,4 +60,12 @@
<result column="shipping_address_line2" jdbcType="BLOB" property="shippingAddressLine2" />
<result column="shipping_address_line3" jdbcType="BLOB" property="shippingAddressLine3" />
</resultMap>
<select id="selectAid" resultType="java.lang.Integer">
SELECT aid
FROM amazon_order
WHERE amazon_order_id = #{amazonOrderId}
and account_id = #{accountId}
and area_id = #{areaId}
</select>
</mapper>
\ No newline at end of file
... ...