Guice DI в Callable - PullRequest
       5

Guice DI в Callable

0 голосов
/ 12 сентября 2018

У меня есть конкретный вопрос по поводу использования Guice в параллельной среде.

У меня есть runnable, который принимает аргумент constrcutor.

class task implements Runnable{
String dbname="";
task(String dbname)
{
this.dbname=dbname
}
@
Inject
private ICacheService cacheService
public void run(){
//logic here

}
bind(ICacheService).to(CacheServiceImpl.class);


}

Вопрос: Как мне создать экземпляр задачи.

Я не могу использовать ExecutorService.submit (новый, так как это не будет правильным способом и не поддается целеустремленности.)

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

После небольшого поиска, я нашел решение. Переплет:

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();
    }



}

Диспетчер задач для отправки задач исполнителю.

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));

    }

}

RunnableFactory

public interface RuunableFactory {

    Task create(String dbname);
}
0 голосов
/ 12 сентября 2018

Я хотел бы создать фабрику, которая создает задачу, внедрить 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, а затем вызову метод create с помощью dbName.

Вы также можете использовать AssistedInject из Guice, чтобы делать подобные вещи.

Кстати, имена классов должны начинаться с заглавной буквы.

...