我目前正在构建一个Dropwizard + Guice + Jersey-based应用程序,其中数据库访问暂时由JDBI处理.
我想要实现的是拥有典型的企业架构,其中Resources访问服务类访问DAO类,而DAO类又访问数据库.如果所有其他方法都失败了,我想我可以在应用程序的run()方法中构建我的对象图,这将很高兴以正确的DI方式连接所有这些.
所以,我遇到了之前提到的这个问题:获取DBIFactory需要环境和配置,当Guice执行注入魔法而不是run()时,它需要在某种程度上可用. .
作为一个Dropwizard和Guice noob,到目前为止我设法把它放在一起就是我需要一个Provider来为我的DAO对象提供一些东西.
public class UserDAOProvider implements Provider<UserDAO> {
@Inject
Environment environment;
@Inject
Configuration configuration;
@Override
public UserDAO get() {
final DBIFactory factory = new DBIFactory();
final (MyConfiguration) config = (MyConfiguration) configuration;
DBI jdbi = null;
try {
jdbi = factory.build(environment, config.getDataSourceFactory(),
"mysql");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return jdbi.onDemand(UserDAO.class);
}
}
Run Code Online (Sandbox Code Playgroud)
将此注册为单身提供商应该让我将UserDAO注入我的服务.
现在,我们如何实际将环境注入到Provider中?目前我被困在Guice抱怨没有为环境找到合适的构造函数,所以它试图实例化它而不是从Dropwizard本身获取它.
看起来这是可行的; 有一个dropwizard-guice包,我认为DropWizardEnvironmentModule是我需要的.但我觉得我只是错过了一些难题,以便了解如何将事情放在一起.到目前为止,我还没有找到一个完整的工作示例......
我想快速确认一下我怀疑这部分RabbitMQ文档说:
消费者的回调是在与Connection管理的线程分开的线程上调度的.这意味着消费者可以安全地在Connection或Channel上调用阻塞方法,例如queueDeclare,txCommit,basicCancel或basicPublish.
每个Channel都有自己的调度线程.对于每个渠道一个消费者的最常见用例,这意味着消费者不会阻止其他消费者.如果每个频道有多个消费者,请注意长时间运行的消费者可能会阻止向该频道上的其他消费者发送回调.
我有各种命令(消息)通过单个入站队列进入,并且通道附加了一个DefaultConsumer.假设DefaultConsumer中有一个线程池让我直接从消费者回调方法运行应用程序逻辑,并且我没有阻止后续命令的处理,这是正确的吗?如果看起来有瓶颈,我可以给RMQ一个更大的线程池吗?
此外,偶尔会有来自其他线程的同一频道的basicPublish.我认为这确实阻止了消费者?我想在这样做时我应该使用一个新频道?