项目学习(2)-order-job
在当前的系统中,因为并发量并不高,服务之间发起异步请求或者异步调用时,没有使用到消息中间件。
而是在各个服务(子系统)的数据库中,创建了event_queue事件对列表和event_handler事件处理表,
再通过编写quartz任务,定时去数据库查询需要处理的订单信息。
表结构如下:
和
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