2 回答
TA贡献2016条经验 获得超9个赞
我将创建一个创建任务的工厂,通过任务中的构造函数注入 ICacheService 并利用 javax.inject.Provider
public class TaskFactory {
private Provider<ICacheService> cacheServiceProvider;
@Inject
public TaskFactory(Provider<ICacheService> cacheServiceProvider) {
this.cacheServiceProvider = cacheServiceProvider;
}
public task create(String dbname) {
return new task(dbname, cacheServiceProvider.get());
}
}
class task implements Runnable {
private final String dbname;
private final ICacheService cacheService;
public task(String dbname, ICacheService cacheService) {
this.dbname = dbname;
this.cacheService = cacheService;
}
@Override
public void run() {
}
}
完成此操作后,我将注入 TaskFactory,然后使用 dbName 调用 create 方法。
你也可以使用Guice 的AssistedInject来做类似的事情。
顺便说一句,类名应该以大写字母开头。
TA贡献1828条经验 获得超13个赞
经过一点谷歌搜索,我找到了解决方案。捆绑:
public class DependecnyBinderModule extends AbstractModule {
@Override
protected void configure() {
bind(CloudSync.class).to(AWSCloudSyncImpl.class);
bind(IConfigurationPropertyInitializer.class).to(ConfigurationPropertyInitializerImpl.class);
bind(ICloudClientProvider.class).to(CloudClientProvider.class);
bind(IQueryConnection.class).to(QueryConnectionImpl.class);
bind(IWorkSpaceDescriptorInitialization.class).to(WorkSpaceDescriptorInitialize.class);
bind(ISubscribeQueue.class).to(SubScribeQueueImpl.class);
bind(InitializeDataSource.class).to(InitializeDataSourceImpl.class);
bind(InitiateQueueListening.class).to(InitiateQueueListeningImpl.class);
bind(DataExtractor.class).to(DataExtractorImpl.class);
bind(DataTransformer.class).in(Scopes.SINGLETON);
bind(TaskDispatcher.class);
**install(new FactoryModuleBuilder().implement(Runnable.class, MultiQueueConsumer.class).build(TaskCreatorFactory.class));**
}
@Provides
@Singleton
ThreadFactory providesThreadFactory() {
return new ThreadFactoryBuilder().setDaemon(true).setNameFormat("RealTimeSync-%d")
.setUncaughtExceptionHandler(new RealTimeSyncExceptionHandler()).build();
}
}
您的 Task Dispatcher 将任务分派给 Executor。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import com.google.inject.Inject;
/**
* @author marwaha
*
*/
public class TaskDispatcher {
@Inject
private ThreadFactory factory;
@Inject
private RuunableFactory factory2;
private ExecutorService executor;
public void dispatch(String name) {
if(executor==null) {
executor=Executors.newFixedThreadPool(5, factory);
}
executor.submit(factory2.create(name));
}
}
可运行工厂
public interface RuunableFactory {
Task create(String dbname);
}
添加回答
举报