dromara / lamp-cloud

lamp-cloud 支持jdk21、jdk17、jdk11、jdk8,ta基于 SpringCloud + SpringBoot 开发的微服务中后台快速开发平台,专注于多租户(SaaS架构)解决方案,亦可作为普通项目(非SaaS架构)的基础开发框架使用,目前已实现插拔式数据库隔离、SCHEMA隔离、字段隔离 等租户隔离方案。
http://tangyh.top
Apache License 2.0
5.47k stars 1.67k forks source link

创建缓存key时失败 #302

Closed hunao0221 closed 1 year ago

hunao0221 commented 1 year ago

版本信息:

JDK 版本(必填) : openjdk version "11.0.18" 2023-01-17 LTS 源码版本(必填):4.14.1 MySQL(必填): 5.7.43 Nacos(必填):2.1.2

问题描述:

在insert时抛出异常, 看起来像是提交task到已关闭的线程池,详情请看日志。 另外,操作的表都没有开启缓存(没有继承cache相关的父类)

报错截图

[lamp-datahub-server:18860::] 2023-08-22 10:49:59.688[ INFO] 37301 [] [consumer-0-C-1:95697] [com.baidu.fsg.uid.buffer.RingBuffer.take:173] Reach the padding threshold:4096. tail:49182, cursor:45087, rest:4095
[lamp-datahub-server:18860::] 2023-08-22 10:49:59.691[ERROR] 37301 [] [consumer-0-C-1:95700] [com.baidu.fsg.uid.impl.CachedUidGenerator.getUid:86] Generate unique id exception. 

java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@73e70d24[Not completed, task = java.util.concurrent.Executors$RunnableAdapter@61a665a3[Wrapped task = com.baidu.fsg.uid.buffer.BufferPaddingExecutor$$Lambda$2478/0x0000000800fdc440@2888cfde]] rejected from java.util.concurrent.ThreadPoolExecutor@555b3681[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 13]
    at java.base/java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2055) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:825) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1355) ~[na:na]
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:118) ~[na:na]
    at com.baidu.fsg.uid.buffer.BufferPaddingExecutor.asyncPadding(BufferPaddingExecutor.java:151) ~[classes/:na]
    at com.baidu.fsg.uid.buffer.RingBuffer.take(RingBuffer.java:175) ~[classes/:na]
    at com.baidu.fsg.uid.impl.CachedUidGenerator.getUid(CachedUidGenerator.java:84) ~[classes/:na]
    at top.tangyh.basic.database.config.LampMetaObjectHandler.fillId(LampMetaObjectHandler.java:83) ~[classes/:na]
    at top.tangyh.basic.database.config.LampMetaObjectHandler.insertFill(LampMetaObjectHandler.java:66) ~[classes/:na]
    at com.baomidou.mybatisplus.core.MybatisParameterHandler.lambda$insertFill$0(MybatisParameterHandler.java:165) ~[mybatis-plus-core-3.5.3.1.jar:3.5.3.1]
    at java.base/java.util.Optional.ifPresent(Optional.java:183) ~[na:na]
    at com.baomidou.mybatisplus.core.MybatisParameterHandler.insertFill(MybatisParameterHandler.java:163) ~[mybatis-plus-core-3.5.3.1.jar:3.5.3.1]
    at com.baomidou.mybatisplus.core.MybatisParameterHandler.process(MybatisParameterHandler.java:116) ~[mybatis-plus-core-3.5.3.1.jar:3.5.3.1]
    at com.baomidou.mybatisplus.core.MybatisParameterHandler.processParameter(MybatisParameterHandler.java:83) ~[mybatis-plus-core-3.5.3.1.jar:3.5.3.1]
    at com.baomidou.mybatisplus.core.MybatisParameterHandler.<init>(MybatisParameterHandler.java:67) ~[mybatis-plus-core-3.5.3.1.jar:3.5.3.1]
    at com.baomidou.mybatisplus.core.MybatisXMLLanguageDriver.createParameterHandler(MybatisXMLLanguageDriver.java:45) ~[mybatis-plus-core-3.5.3.1.jar:3.5.3.1]
    at org.apache.ibatis.session.Configuration.newParameterHandler(Configuration.java:677) ~[mybatis-3.5.10.jar:3.5.10]
    at org.apache.ibatis.executor.statement.BaseStatementHandler.<init>(BaseStatementHandler.java:69) ~[mybatis-3.5.10.jar:3.5.10]
    at org.apache.ibatis.executor.statement.PreparedStatementHandler.<init>(PreparedStatementHandler.java:41) ~[mybatis-3.5.10.jar:3.5.10]
    at org.apache.ibatis.executor.statement.RoutingStatementHandler.<init>(RoutingStatementHandler.java:46) ~[mybatis-3.5.10.jar:3.5.10]
    at org.apache.ibatis.session.Configuration.newStatementHandler(Configuration.java:690) ~[mybatis-3.5.10.jar:3.5.10]
    at org.apache.ibatis.executor.BatchExecutor.doUpdate(BatchExecutor.java:57) ~[mybatis-3.5.10.jar:3.5.10]
    at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) ~[mybatis-3.5.10.jar:3.5.10]
    at jdk.internal.reflect.GeneratedMethodAccessor145.invoke(Unknown Source) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49) ~[mybatis-3.5.10.jar:3.5.10]
    at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.3.1.jar:3.5.3.1]
    at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62) ~[mybatis-3.5.10.jar:3.5.10]
    at com.sun.proxy.$Proxy229.update(Unknown Source) ~[na:na]
    at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:194) ~[mybatis-3.5.10.jar:3.5.10]
    at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:181) ~[mybatis-3.5.10.jar:3.5.10]
    at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.lambda$saveBatch$0(ServiceImpl.java:136) ~[mybatis-plus-extension-3.5.3.1.jar:3.5.3.1]
    at com.baomidou.mybatisplus.extension.toolkit.SqlHelper.lambda$executeBatch$1(SqlHelper.java:222) ~[mybatis-plus-extension-3.5.3.1.jar:3.5.3.1]
    at com.baomidou.mybatisplus.extension.toolkit.SqlHelper.executeBatch(SqlHelper.java:182) ~[mybatis-plus-extension-3.5.3.1.jar:3.5.3.1]
    at com.baomidou.mybatisplus.extension.toolkit.SqlHelper.executeBatch(SqlHelper.java:217) ~[mybatis-plus-extension-3.5.3.1.jar:3.5.3.1]
    at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.executeBatch(ServiceImpl.java:240) ~[mybatis-plus-extension-3.5.3.1.jar:3.5.3.1]
    at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.saveBatch(ServiceImpl.java:136) ~[mybatis-plus-extension-3.5.3.1.jar:3.5.3.1]
    at com.baomidou.mybatisplus.extension.service.IService.saveBatch(IService.java:73) ~[mybatis-plus-extension-3.5.3.1.jar:3.5.3.1]
    at com.baomidou.mybatisplus.extension.service.IService$$FastClassBySpringCGLIB$$f8525d18.invoke(<generated>) ~[mybatis-plus-extension-3.5.3.1.jar:3.5.3.1]
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.28.jar:5.3.28]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) ~[spring-aop-5.3.28.jar:5.3.28]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.28.jar:5.3.28]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.28.jar:5.3.28]
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.28.jar:5.3.28]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.28.jar:5.3.28]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.28.jar:5.3.28]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.28.jar:5.3.28]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.28.jar:5.3.28]
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) ~[spring-aop-5.3.28.jar:5.3.28]
    at top.tangyh.lamp.meter.manager.meas.impl.CoreMeterMeasManagerImpl$$EnhancerBySpringCGLIB$$87fbd921.saveBatch(<generated>) ~[classes/:na]
    at top.tangyh.lamp.meter.service.meas.impl.CoreMeterMeasServiceImpl.saveFromKafka(CoreMeterMeasServiceImpl.java:56) ~[classes/:na]
    at top.tangyh.lamp.meter.service.meas.impl.CoreMeterMeasServiceImpl$$FastClassBySpringCGLIB$$6c152abf.invoke(<generated>) ~[classes/:na]
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.28.jar:5.3.28]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) ~[spring-aop-5.3.28.jar:5.3.28]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.28.jar:5.3.28]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.28.jar:5.3.28]
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.28.jar:5.3.28]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.28.jar:5.3.28]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.28.jar:5.3.28]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.28.jar:5.3.28]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.28.jar:5.3.28]
    at com.baomidou.dynamic.datasource.aop.DynamicDataSourceAnnotationInterceptor.invoke(DynamicDataSourceAnnotationInterceptor.java:50) ~[dynamic-datasource-spring-boot-starter-3.6.1.jar:3.6.1]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.28.jar:5.3.28]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.28.jar:5.3.28]
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) ~[spring-aop-5.3.28.jar:5.3.28]
    at top.tangyh.lamp.meter.service.meas.impl.CoreMeterMeasServiceImpl$$EnhancerBySpringCGLIB$$4e2601df.saveFromKafka(<generated>) ~[classes/:na]
    at top.tangyh.lamp.datahub.core.handler.impl.ToDbMessageHandler.handle(ToDbMessageHandler.java:56) ~[classes/:na]
    at top.tangyh.lamp.datahub.core.processor.MultiActionKafkaMessageProcessor.processMessage(MultiActionKafkaMessageProcessor.java:53) ~[classes/:na]
    at top.tangyh.lamp.datahub.core.listener.impl.MultiActionMessageListener.onMessage(MultiActionMessageListener.java:48) ~[classes/:na]
    at top.tangyh.lamp.datahub.core.listener.impl.MultiActionMessageListener.onMessage(MultiActionMessageListener.java:20) ~[classes/:na]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeOnMessage(KafkaMessageListenerContainer.java:2685) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeOnMessage(KafkaMessageListenerContainer.java:2650) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeRecordListener(KafkaMessageListenerContainer.java:2577) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeWithRecords(KafkaMessageListenerContainer.java:2457) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeRecordListener(KafkaMessageListenerContainer.java:2335) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeListener(KafkaMessageListenerContainer.java:2006) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeIfHaveRecords(KafkaMessageListenerContainer.java:1375) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.pollAndInvoke(KafkaMessageListenerContainer.java:1366) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:1257) ~[spring-kafka-2.8.11.jar:2.8.11]
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) ~[na:na]
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
    at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na]

[lamp-datahub-server:18860::] 2023-08-22 10:49:59.777[ INFO] 37301 [] [consumer-0-C-1:95786] [org.apache.kafka.clients.consumer.KafkaConsumer.seek:1585] [Consumer clientId=huhongyandeMini-0, groupId=DEFAULT-MAML-1_meterMeasJson_234_DB] Seeking to offset 1688273 for partition meterMeasJson_234-0
[lamp-datahub-server:18860::] 2023-08-22 10:49:59.782[ERROR] 37301 [] [consumer-0-C-1:95791] [o.s.kafka.listener.KafkaMessageListenerContainer.error:149] Error handler threw an exception

org.springframework.kafka.KafkaException: Seek to current after exception; nested exception is org.springframework.kafka.listener.ListenerExecutionFailedException: Listener failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: com.baidu.fsg.uid.exception.UidGenerateException: java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@73e70d24[Not completed, task = java.util.concurrent.Executors$RunnableAdapter@61a665a3[Wrapped task = com.baidu.fsg.uid.buffer.BufferPaddingExecutor$$Lambda$2478/0x0000000800fdc440@2888cfde]] rejected from java.util.concurrent.ThreadPoolExecutor@555b3681[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 13]
### The error may exist in top/tangyh/lamp/meter/mapper/meas/CoreMeterMeasMapper.java (best guess)
### The error may involve top.tangyh.lamp.meter.mapper.meas.CoreMeterMeasMapper.insert
### The error occurred while executing an update
### Cause: com.baidu.fsg.uid.exception.UidGenerateException: java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@73e70d24[Not completed, task = java.util.concurrent.Executors$RunnableAdapter@61a665a3[Wrapped task = com.baidu.fsg.uid.buffer.BufferPaddingExecutor$$Lambda$2478/0x0000000800fdc440@2888cfde]] rejected from java.util.concurrent.ThreadPoolExecutor@555b3681[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 13]
    at org.springframework.kafka.listener.SeekUtils.seekOrRecover(SeekUtils.java:208) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.DefaultErrorHandler.handleRemaining(DefaultErrorHandler.java:135) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeErrorHandler(KafkaMessageListenerContainer.java:2707) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeRecordListener(KafkaMessageListenerContainer.java:2588) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeWithRecords(KafkaMessageListenerContainer.java:2457) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeRecordListener(KafkaMessageListenerContainer.java:2335) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeListener(KafkaMessageListenerContainer.java:2006) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeIfHaveRecords(KafkaMessageListenerContainer.java:1375) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.pollAndInvoke(KafkaMessageListenerContainer.java:1366) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:1257) ~[spring-kafka-2.8.11.jar:2.8.11]
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) ~[na:na]
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
    at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na]
Caused by: org.springframework.kafka.listener.ListenerExecutionFailedException: Listener failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: com.baidu.fsg.uid.exception.UidGenerateException: java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@73e70d24[Not completed, task = java.util.concurrent.Executors$RunnableAdapter@61a665a3[Wrapped task = com.baidu.fsg.uid.buffer.BufferPaddingExecutor$$Lambda$2478/0x0000000800fdc440@2888cfde]] rejected from java.util.concurrent.ThreadPoolExecutor@555b3681[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 13]
### The error may exist in top/tangyh/lamp/meter/mapper/meas/CoreMeterMeasMapper.java (best guess)
### The error may involve top.tangyh.lamp.meter.mapper.meas.CoreMeterMeasMapper.insert
### The error occurred while executing an update
### Cause: com.baidu.fsg.uid.exception.UidGenerateException: java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@73e70d24[Not completed, task = java.util.concurrent.Executors$RunnableAdapter@61a665a3[Wrapped task = com.baidu.fsg.uid.buffer.BufferPaddingExecutor$$Lambda$2478/0x0000000800fdc440@2888cfde]] rejected from java.util.concurrent.ThreadPoolExecutor@555b3681[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 13]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.decorateException(KafkaMessageListenerContainer.java:2724) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeOnMessage(KafkaMessageListenerContainer.java:2690) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeOnMessage(KafkaMessageListenerContainer.java:2650) ~[spring-kafka-2.8.11.jar:2.8.11]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeRecordListener(KafkaMessageListenerContainer.java:2577) ~[spring-kafka-2.8.11.jar:2.8.11]
    ... 9 common frames omitted
Caused by: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
zuihou commented 1 year ago

偶现还是必然出现

hunao0221 commented 1 year ago

偶现还是必然出现

偶然出现的一次,在批量保存/更新的时候。

zuihou commented 1 year ago

批量保存了多少数据

hunao0221 commented 1 year ago

批量保存了多少数据

也就几十或者几百条,不过连续了很多次

hunao0221 commented 1 year ago

确认了一下,复现了,不过可能算是我这边的问题。它发生在手动停止应用的时候 CachedUidGenerator destroy放在数据源closed之后会不会合理一些? @zuihou

hunao0221 commented 1 year ago

Anyway. 这算是比较特殊的场景吧,暂时将CachedUidGenerator 依赖于dataSource 解决问题

@DependsOn({"dataSource"})
public class CachedUidGenerator extends DefaultUidGenerator implements DisposableBean {
  ....
}