如何获取控制柜订单信息

如何获取控制柜订单信息,第1张

联系供应商以获得订单信息。

1、直接联系控制柜供应商:如果已有控制柜的供应商,应该能够联系销售团队或客户支持部门获取订单信息。

2、在线商城购买:从在线商城购买了控制柜,可以获取到包含订单信息的购买确认邮件。

3、索取控制柜制造厂商的销售合同:如果是从生产厂商直接购买控制柜,那么应该能够(最好以书面形式)要求控制柜制造商提供此类订单信息的副本。

Python可以自动下载订单,你可以使用Python编写一个脚本来完成这一任务,一般来说,需要实现以下几个步骤:1)获取订单信息;2)识别相关订单信息;3)下载相关订单信息;4)存储下载的订单信息。

在Spring中使用异步事件实现同步事务:

结合Scala+Spring,我们将采取一个很简单的场景:下订单,然后发送一封电子邮件。

编制一个服务:

@Service

class OrderService @Autowired() (orderDao: OrderDao, mailNotifier: OrderMailNotifier) {

@Transactional

def placeOrder(order: Order) {

orderDao save order //保存订单

mailNotifier sendMail order //发送邮件

}

}

上面代码是在保存订单和发送邮件两个同步执行,发送邮件需要连接邮件服务器,比较耗时,拖延了整个性能,我们采取异步发送电子邮件,利用Spring内置的自定义事件,与JMS或其他生产者 - 消费者类似。

case class OrderPlacedEvent(order: Order) extends ApplicationEvent

@Service

class OrderService @Autowired() (orderDao: OrderDao, eventPublisher: ApplicationEventPublisher) {

@Transactional

def placeOrder(order: Order) {

orderDao save order

eventPublisher publishEvent OrderPlacedEvent(order)

}

}

区别是继承了ApplicationEvent 之前是直接用 OrderMailNotifier 直接发送,而现在我们使用ApplicationEventPublisher 发送发邮件事件了。

事件监听者代码如下:

@Service

class OrderMailNotifier extends ApplicationListener[OrderPlacedEvent] {

def onApplicationEvent(event: OrderPlacedEvent) {

//sending e-mail

}

}

在监听者方法中真正实现邮件发送。

但是Spring的ApplicationEvents是同步事件,意味着我们并没有真正实现异步,程序还会在这里堵塞,如果希望异步,我们需要重新定义一个ApplicationEventMulticaster,实现类型SimpleApplicationEventMulticaster和TaskExecutor:

@Bean

def applicationEventMulticaster() = {

val multicaster = new SimpleApplicationEventMulticaster()

multicastersetTaskExecutor(taskExecutor())

multicaster

}

@Bean

def taskExecutor() = {

val pool = new ThreadPoolTaskExecutor()

poolsetMaxPoolSize(10)

poolsetCorePoolSize(10)

poolsetThreadNamePrefix("Spring-Async-")

pool

}

Spring通过使用TaskExecutor已经支持广播事件了,对onApplicationEvent() 标注 @Async

@Async

def onApplicationEvent(event: OrderPlacedEvent) { //

如果你希望使用@Async,可以编制自己的异步执行器:

@Configuration

@EnableAsync

class ThreadingConfig extends AsyncConfigurer {

def getAsyncExecutor = taskExecutor()

@Bean

def taskExecutor() = {

val pool = new ThreadPoolTaskExecutor()

poolsetMaxPoolSize(10)

poolsetCorePoolSize(10)

poolsetThreadNamePrefix("Spring-Async-")

pool

}

}

@ EnableAsync是足够了。,默认情况下,Spring使用SimpleAsyncTaskExecutor类创建新的线程。

以上所有设置暴露一个真正的问题。现在,我们虽然使用其他线程发送一个异步消息处理。不幸的是,我们引入竞争条件。

开始事务

存储order到数据库

发送一个包装order的消息

确认

异步线程获得OrderPlacedEvent并开始处理。现在的问题是,它发生(3)之后,还是(4)之前或者(4)之后?这有一个很大的区别!在前者的情况下,交易也尚未提交订单所以不存在于数据库中。另一方面,延迟加载可能已经在工作,致使订单对象仍然然绑定在 PersistenceContext(缺省我们使用JPA)。

解决办法是使用 TransactionSynchronizationManager,可以注册很多监听者 TransactionSynchronization,它对于事务的提交或回滚都有事件发送。

@Transactional

def placeOrder(order: Order) {

orderDao save order

afterCommit {

eventPublisher publishEvent OrderPlacedEvent(order)

}

}

private def afterCommit[T](fun: => T) {

TransactionSynchronizationManagerregisterSynchronization(new TransactionSynchronizationAdapter {

override def afterCommit() {

fun

}

})

}

当前事务提交后 afterCommit()接受调用,可以安全地调用registerSynchronization()多次 - 监听器存储在Set并且本地保存到当前事务中,事务提交后消失。

我们将afterCommit方法单独抽象成一个类,分离关注。

class TransactionAwareApplicationEventPublisher(delegate: ApplicationEventPublisher)

extends ApplicationEventPublisher {

override def publishEvent(event: ApplicationEvent) {

if (TransactionSynchronizationManagerisActualTransactionActive) {

TransactionSynchronizationManagerregisterSynchronization(

new TransactionSynchronizationAdapter {

override def afterCommit() {

delegate publishEvent event

}

})

}

else

delegate publishEvent event

}

}

TransactionAwareApplicationEventPublisher是实现Spring的ApplicationEventPublisher。

我们要将这个新的实现告诉Spring替换掉旧的,用@Primary:

@Resource

val applicationContext: ApplicationContext = null

@Bean

@Primary

def transactionAwareApplicationEventPublisher() =

new TransactionAwareApplicationEventPublisher(applicationContext)

再看看原来的订单服务:

@Service

class OrderService @Autowired() (orderDao: OrderDao, eventPublisher:ApplicationEventPublisher) {

@Transactional

def placeOrder(order: Order) {

orderDao save order

eventPublisher publishEvent OrderPlacedEvent(order)

}

注意这里ApplicationEventPublisher已经是我们自己实现的TransactionAwareApplicationEventPublisher,将被自动注入这个服务。

最后,要在真正订单保存的业务代码上放置事务:

def placeOrder(order: Order) {

storeOrder(order)

eventPublisher publishEvent OrderPlacedEvent(order)

}

@Transactional

def storeOrder(order: Order) = orderDao save order

支付宝的支付流程:

1:商户客户端请求后台服务器获取签名后的订单信息

2:后台服务器返回给客户端签名后的信息

3:客户端调用支付宝客户端的支付接口

4:支付宝客户端向支付宝服务端发送支付请求

5:支付宝服务端完成支付

6:向支付宝客户端返回支付结果

7:支付宝客户端将支付结果显示给客户端

8:客户端将支付结果返回给服务器进行验签,解析

9:服务器将最终支付结果返回给客户端

10:客户端将支付结果显示给用户

11:支付宝服务端异步发送支付通知给服务器

12:服务器响应支付宝服务端的通知

简易流程:

1:服务器生成前面后的订单信息返回给客户端

2:客户端调用支付接口,并获取接口的支付结果

3:同步支付结果给服务器进行验签,解析

4:服务器将支付结果返回给客户端,并展示给用户

5:支付宝异步向服务器发送支付通知

6:服务器(修改订单状态并)响应支付宝的通知。

以上就是关于如何获取控制柜订单信息全部的内容,包括:如何获取控制柜订单信息、python自动下载订单、如何使用Spring配置异步和同步事件发布等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9619375.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存