Java Singleton注释-在调用后期销毁之前创建的新Singleton
我正在使用单例来使用Java Singleton注释-在调用后期销毁之前创建的新Singleton,java,jakarta-ee,jax-rs,glassfish-4,Java,Jakarta Ee,Jax Rs,Glassfish 4,我正在使用单例来使用JODConverter。问题是,当接收到一个新请求时,会创建一个新的单例,而旧单例会被销毁,但顺序不匹配:在旧单例的@PreDestroy方法之前调用新单例的@postcontract方法 这会导致故障,因为服务器已在为JodConverter运行 代码如下: @ConcurrencyManagement(ConcurrencyManagementType.CONTAINER) @Startup @Singleton public class FileConverter {
JODConverter
。问题是,当接收到一个新请求时,会创建一个新的单例,而旧单例会被销毁,但顺序不匹配:在旧单例的@PreDestroy
方法之前调用新单例的@postcontract
方法
这会导致故障,因为服务器已在为JodConverter
运行
代码如下:
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
@Startup
@Singleton
public class FileConverter {
private static final String PROPERTIES_FILE = "path/conf.properties";
private static final String OO_HOME_KEY = "viewers.ooHome";
private static final String OO_PORT_KEY = "viewers.ooPort";
private static final Logger LOGGER = Logger.getLogger(FileConverter.class.getName());
private OfficeManager officeManager;
@PostConstruct
private void init() {
InputStream inputStream = null;
try {
Properties properties = new Properties();
inputStream = FileConverter.class.getResourceAsStream(PROPERTIES_FILE);
properties.load(inputStream);
String ooHome = properties.getProperty(OO_HOME_KEY);
int ooPort = Integer.parseInt(properties.getProperty(OO_PORT_KEY));
officeManager = new DefaultOfficeManagerConfiguration()
.setOfficeHome(new File(ooHome))
.setPortNumber(ooPort)
.buildOfficeManager();
officeManager.start();
} catch (IOException e) {
LOGGER.log(Level.SEVERE, null, e);
throw new RuntimeException(e);
} finally {
try{
if(inputStream!=null){
inputStream.close();
}
}catch (IOException e){
LOGGER.log(Level.FINEST, null, e);
}
}
}
@PreDestroy
private void close(){
officeManager.stop();
}
编辑:
我已经从javax.ejb.Singleton改为javax.inject.Singleton,并自己管理并发性。非常感谢@peeskillet我想知道你是否在使用
@javax.ejb.Singleton
而不是@javax.inject.Singleton
是的,我在使用javax.ejb.Singleton!是的,通过切换到javax.inject.Singleton,它就开始工作了。但是很明显,它不支持我在这个单例业务逻辑中需要的并发性。这个单例有任何业务方法吗?如果是,您是如何引用它的?