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,它就开始工作了。但是很明显,它不支持我在这个单例业务逻辑中需要的并发性。这个单例有任何业务方法吗?如果是,您是如何引用它的?