请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

jeesite

 找回密码
 注册新会员
查看: 1371|回复: 8

[jeesite] 集群模式下生成唯一订单号

[复制链接]
姚海陆 发表于 2016-3-27 17:54:35 | 显示全部楼层 |阅读模式
本帖最后由 姚海陆 于 2016-3-27 18:15 编辑

http://www.oschina.net/p/quartz

Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中。它提供了巨大的灵 活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,EJB作业预构 建,JavaMail及其它,支持cron-like表达式等等。
该项目已经被 Terracotta收购。
示例代码:


集群模式下生成唯一订单号

比如格式为:

yyyy-MM-dd + 00000001,
yyyy-MM-dd + 00000002,
yyyy-MM-dd + 00000003,
...

yyyy-MM-dd是订单产生日日期,后跟8位数字,每天都是从00000001开始。

大家都有什么好方法,能保证唯一性和速度。

办法有,有点小麻烦。

首先定义一个工厂类,生成你的订单号序列。
  1. package bean;

  2. import java.text.DecimalFormat;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;

  5. import org.springframework.beans.factory.FactoryBean;


  6. public class SequenceFactoryBean implements FactoryBean<String> {

  7.         private static long counter = 0;
  8.         
  9.         public synchronized String getObject() throws Exception {
  10.                 String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " + ";
  11.                 String sequ = new DecimalFormat("00000000").format(counter ++);
  12.                 return date + sequ;
  13.         }

  14.         public Class<String> getObjectType() {
  15.                 return String.class;
  16.         }

  17.         public boolean isSingleton() {
  18.                 return false;
  19.         }

  20.         public static void reset() {
  21.                 SequenceFactoryBean.counter = 0;
  22.         }
  23. }
复制代码
注意里面的静态方法 reset方法, 这个用来在每天00:00:00重置。
这个方法由任务调度框架Quartz调用。

首先定义一个job
  1. package job;

  2. import bean.SequenceFactoryBean;

  3. public class SequenceResetJob {

  4.         public void execute() {
  5.                 SequenceFactoryBean.reset();
  6.         }
  7. }
复制代码
配置Quartz,在每天零点触发触发器就可以了。

Spring 的配置文件。
  1. <bean id="sequence" class="bean.SequenceFactoryBean" />

  2. <bean id="job" class="job.SequenceResetJob" />

  3. <bean id="jobDetail"
  4.         class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  5.         <property name="targetObject" ref="job" />
  6.         <property name="targetMethod" value="execute" />
  7. </bean>

  8. <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
  9.         <property name="jobDetail" ref="jobDetail" />
  10.         <property name="cronExpression" value="0 0 0 * * ?" />
  11. </bean>

  12. <bean name="quartzScheduler"
  13.         class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  14.         <property name="triggers">
  15.                 <list>
  16.                         <ref bean="cronTrigger" />
  17.                 </list>
  18.         </property>
  19. </bean>
复制代码
参考资料:
http://bbs.csdn.net/topics/360203885
回复

使用道具 举报

 楼主| 姚海陆 发表于 2016-3-27 18:23:34 | 显示全部楼层
  1.         <bean id="sequence" class="com.thinkgem.jeesite.order.utils.SequenceFactoryBean" />

  2.         <bean id="job" class="com.thinkgem.jeesite.order.utils.SequenceResetJob" />

  3.         <bean id="jobDetail"
  4.                 class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  5.                 <property name="targetObject" ref="job" />
  6.                 <property name="targetMethod" value="execute" />
  7.         </bean>

  8.         <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
  9.                 <property name="jobDetail" ref="jobDetail" />
  10.                 <property name="cronExpression" value="0 0 0 * * ?" />
  11.         </bean>

  12.         <bean name="quartzScheduler"
  13.                 class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  14.                 <property name="triggers">
  15.                         <list>
  16.                                 <ref bean="cronTrigger" />
  17.                         </list>
  18.                 </property>
  19.         </bean>
复制代码
回复 支持 反对

使用道具 举报

 楼主| 姚海陆 发表于 2016-3-27 19:52:24 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 姚海陆 发表于 2016-3-27 19:52:59 | 显示全部楼层
待完善。简单的例子,免费下载。参考http://www.meiriyouke.net/?p=82 谢谢原作者 也谢谢ZJ
http://download.csdn.net/detail/wocao003/8621521
回复 支持 反对

使用道具 举报

 楼主| 姚海陆 发表于 2016-3-27 19:53:13 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 姚海陆 发表于 2016-3-27 20:13:45 | 显示全部楼层
  1.         <bean id="sequenceNo" class="com.thinkgem.jeesite.order.utils.SequenceFactoryBean" />

  2.         <bean id="jobNo" class="com.thinkgem.jeesite.order.utils.SequenceResetJob" />

  3.         <bean id="jobDetail"
  4.                 class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  5.                 <property name="targetObject" ref="jobNo" />
  6.                 <property name="targetMethod" value="execute" />
  7.         </bean>

  8.         <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
  9.                 <property name="jobDetail" ref="jobDetail" />
  10.                 <property name="cronExpression" value="0 0 0 * * ?" />
  11.         </bean>

  12.         <bean name="quartzScheduler"
  13.                 class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  14.                 <property name="triggers">
  15.                         <list>
  16.                                 <ref bean="cronTrigger" />
  17.                         </list>
  18.                 </property>
  19.         </bean>
复制代码
回复 支持 反对

使用道具 举报

 楼主| 姚海陆 发表于 2016-3-27 20:24:57 | 显示全部楼层
本帖最后由 姚海陆 于 2016-3-27 20:25 编辑

http://download.csdn.net/detail/evankaka/8704473
http://blog.csdn.net/evankaka/article/details/45400781


Quartz2.2.1基于Spring注解方式配置Quartz  
回复 支持 反对

使用道具 举报

 楼主| 姚海陆 发表于 2016-3-28 10:00:57 | 显示全部楼层
scheduling.quartz.CronTriggerBean has interface org.quartz.CronTrigger as super class

http://blog.csdn.net/lzj0470/article/details/17786587

quartz版本号:2.1.7

错误:
  1. Caused by: java.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.CronTriggerBean has interface org.quartz.CronTrigger as super class
  2.         at java.lang.ClassLoader.defineClass1(Native Method)
  3.         at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
  4.         at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
  5.         at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
  6.         at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2854)
  7.         at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1159)
  8.         at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1647)
  9.         at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
  10.         at org.springframework.util.ClassUtils.forName(ClassUtils.java:260)
  11.         at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:416)
  12.         at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1290)
  13.         at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1261)
复制代码

解决:

将CronTriggerBean修改为CronTriggerFactoryBean。如:


  1. <bean id="CronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
  2.                 <property name="jobDetail" ref="myjob"/>
  3.                 <property name="cronExpression" value="0/2 * * * * ?"/>
  4.         </bean>
复制代码


注意:


由于Quartz 2.x修改了部分API,所以需要修改一下Quartz的配置。大体来说很简单,如下:

1)升级Spring的jar包

2)升级Quartz的jar包

3)修改配置

  • 将CronTriggerBean修改为CronTriggerFactoryBean
  • 将JobDetailBean修改为JobDetailFactoryBean



回复 支持 反对

使用道具 举报

 楼主| 姚海陆 发表于 2016-3-28 10:01:19 | 显示全部楼层
http://blog.csdn.net/yzh54ak/article/details/6292143
spring多个定时任务quartz配置
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册新会员

本版积分规则

QQ|手机版|小黑屋|Archiver|jeesite 官方论坛. ( 吉ICP备12004769号  

GMT+8, 2017-5-1 01:08 , Processed in 0.218750 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表