项目学习(2)-order-job

在当前的系统中,因为并发量并不高,服务之间发起异步请求或者异步调用时,没有使用到消息中间件。

而是在各个服务(子系统)的数据库中,创建了event_queue事件对列表和event_handler事件处理表,

再通过编写quartz任务,定时去数据库查询需要处理的订单信息。

表结构如下:

项目学习(2)-order-job

项目学习(2)-order-job

e_type是约定的任务类型,e_status是执行结果(0:未执行,1:已执行,2:异常)

 

下面我们来看看它们是怎么被执行的:

quartz本身是基于线程池实现的

<!--线程池设置-->
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="100" />
    <property name="maxPoolSize" value="1000" />
    <property name="queueCapacity" value="2000" />
</bean>
<!--定义OrderJOB-->
<bean id="orderJob" class="com.xfs.order.job.commonjob.OrderJob"/>
<!--定义JobDetail-->
<bean id="orderJobDetail1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <!--要执行的Job-->
    <property name="targetObject" ref="orderJob" />
    <!--要执行的方法-->
    <property name="targetMethod" value="pushUnDistributedOrderToWMS" />
    <!-- false: 上次执行结束,才会执行下一次 -->
    <property name="concurrent" value="false" />
</bean>
<!--定义触发器 4.1及以后的实现方式 CronTriggerFactoryBean-->
<bean id="orderTrigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="jobDetail" ref="orderJobDetail1" />
    <property name="cronExpression" value="0/10 * * * * ?" />
</bean>

然后会去直接java的接口里的方法。

/**
 * 定时任务
 *
 * @author daxiong
 * @date created in 13:11 2018/1/25
 */
@Component
public class OrderJob {

    @Autowired
    private UnDistributedOrderToWMSService unDistributedOrderToWMSService;
    
   /** * 推送待配货订单到WMS 
    *
    * @author daxiong 
    * @date created in 10:02 2018/2/10 
    */ 
    public void pushUnDistributedOrderToWMS() { 
        unDistributedOrderToWMSService.pushUnDistributedOrderToWMS(); 
    }
}

然后就是正常的service层里,注入dao层对象,执行查数据库方法,或者通过dubbo的配置,执行RPC远程接口调用了。

转载于:https://my.oschina.net/xiaoyoung/blog/3054017