在我的Web应用程序中,我有一个后台服务。该服务使用Generator类,该类包含Engine类,并且ExecutorService
配置为使用多个线程并接受GeneratorTasks。
@Component
public class Generator {
@Autowired
private Engine heavyEngine;
private ExecutorService exec = Executors.newFixedThreadPool(3);
//I actually pass the singleton instance Generator class into the task.
public void submitTask(TaskModel model, TaskCallback callback) {
this.exec.submit(new GeneratorTask(model, this, callback));
}
}
@Component
public class Engine {
public Engine() {
//time-consuming initialization code here
}
}
public class GeneratorTask implements Callable<String> {
public GeneratorTask(TaskModel m, Generator g, ReceiptCallback c) {
this.m = m;
this.generator = g;
this.c = c;
}
public String call() throws Exception {
//This actually calls the Engine class of the generator.
//Maybe I should have passed the Engine itself?
this.generator.runEngine(c);
}
}
Engine类需要很长时间进行初始化,因此理想情况下,我希望每个线程仅初始化一次。我不能仅仅使它成为一个单例实例,因为该实例不能在多个线程之间共享(它依赖于顺序处理)。不过,在完成处理任务之后,可以很好地重用实例。
我当时正在考虑使该private Engine heavyEngine
变量成为ThreadLocal变量。但是,我也是Spring的新手,所以我想知道是否还有另一种使用Spring注释注入ThreadLocal变量的方法。我已经考虑过将bean限定在request
范围内,但是我不确定在我的设计下我应该如何去做。
任何有关如何改进我的设计的指导将不胜感激。
首先,放弃ThreadLocal
-这个班级有些可怕。您需要的只是对象池。它不是一个众所周知的功能,但是Spring也支持此功能:
<bean id="engineProto" class="Engine" scope="prototype" lazy-init="true"/>
<bean id="engine" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="targetSource">
<bean class="org.springframework.aop.target.CommonsPoolTargetSource">
<property name="targetClass" value="Engine"/>
<property name="targetBeanName" value="engineProto"/>
<property name="maxSize" value="3"/>
<property name="maxWait" value="5000"/>
</bean>
</property>
</bean>
现在,当您注入时engine
,您实际上将收到代理对象(Engine
将需要一个接口),该代理对象会将所有调用委派给池中的空闲对象。池大小是可配置的。当然,没有什么阻止您使用ThreadLocalTargetSource
哪个使用ThreadLocal
代替Commons
Pool
。两种方法均保证对线程的独占,线程安全访问Engine
。
最后,您可以手动使用池化(但是上面解决方案的优点在于它是完全透明的)或切换到按定义池化的EJB。
问题内容: 我想知道是否无论如何都要使JformattedTextField或jtextField表现得像自动柜员机钱输入。我的意思是,您从右至左输入,说输入10,您需要再按2再加上0,这样它将是10.00。程序从右到左输入时会自动输入小数点?如果未输入2 0,则为.10。这可能吗?如果我想使用该字符串进行计算,该如何返回给我?我尝试了抽象格式化程序,但是效果不是很好。我想用它来输入客户收到的金额
问题内容: 我在Team和Player类之间有一种@OneToMany关系。我想在您的玩家之间保存一个Team对象。玩家的标识符由团队外键和列表索引组成,如下所示。我有一个这样的映射,因为我需要保存Team和您的Players同时吃饭。 所以,如果我使用以下 无论是否使用@ CollectionsOfElements,Player类都需要一个@Embeddable注释,而不是一个@Entity,这
问题内容: 我正在寻找一种创建表单的方法,按Enter键可使焦点移至页面上的“下一个”表单元素。我一直在网上找到的解决方案是… 不幸的是,这似乎仅在IE中有效。因此,这个问题的实质是,是否有人知道适用于FF和Chrome的解决方案?另外,我宁愿不必将 onkeydown 事件添加到表单元素本身,但是如果那是唯一的方法,则必须这样做。 编辑:另外,我已经看到人们提出了这样的问题,即这不是好样式,因为
当我使用命令列出所有分支时,我会看到的输出。 命令应该显示分支列表,就像对文件所做的那样。 这是我得到的输出: 如何获得git分支的默认行为?是什么导致分页输出? 我将ZSH与(其中Git没有任何内容)一起使用,我的如下所示:
我正在阅读有关流的信息,发现我们可以使用setvbuf()函数来控制流......它写的是在行缓冲模式中,当遇到换行符时流将数据发送到文件中,在无缓冲状态下没有缓冲......所以我写了以下代码...... 所以我认为,因为这些是无缓冲流,所以输入应该在我写入屏幕后立即发送到标准输出。。。但程序在写入每一行后等待我按enter键,然后屏幕上只显示输出(由于fwrite)。。。我的问题是,当这些是无
问题内容: 如何在Go中很好地解析程序参数列表并自动处理“ –help”和/或“ –version”(例如“ ”)? 问题答案: 我为您而做: 另请参阅https://play.golang.org/p/XtNXG-DhLI 测试: