-2

我即将编写一个 MMO,使用以 JSON 响应的 HTTP 请求。

我是用 Java EE 风格编写的,希望移植到 Java EE 不会比它更难。但后来我发现我的几个 sinleton 的静态实例变量没有正确创建——类加载器在从 servlet 调用 SingletonClass.getInstance() 时生成了一堆。

我非常绝望,并认为添加@Singleton 描述会有所帮助。但事情并不那么容易。我的类在使用@EJB ClassName var 添加它们时根本不起作用。上下文查找也不起作用。

我尝试在 Eclipse、NetBeans 中开发,使用 Glassfish,尝试设置它,但没有任何帮助。我不知道该怎么办,现在真的很绝望。

我所需要的只是几个类,它们在加载应用程序时一直工作以处理游戏事件并保存记录的用户数据(分布在保存用户数据、怪物等的非 EJB 对象中),每个类都有一些定时事件记录的用户和使用 JSON 响应 HTTP POST 请求的能力。我什至不需要 ORM,我自己编写了所有查询,但仍然......必须工作的东西根本行不通。

我知道所有这些听起来很混乱且没有信息,但我不知道该怎么做——我的问题在哪里?也许,我应该填写 web.xml,或者使用不同的端口,或者飞向月球?或者只是改变编程语言?很抱歉您花时间阅读本文。

UPD。一些应用方案部分。包“服务器”中的前两个。

    @Startup
    @Singleton 
    public class DbWrapper

处理所有数据库连接,DbConnectionPool 是非单例类,它处理 java.sql.Conneciton 池。

    @Startup
    @Singleton
    @DependsOn("DbWrapper")
    public class World

是另一个处理所有游戏内事件的类,它包含已登录用户的 HashMap。用户和怪物类来自包“实体”(用户持有怪物列表)。

包“servlets”包含 HttpServlet 后代,注解 @WebServlet("/pathname"),尝试使用

    @EJB World world

例如。但是诸如 world.getUser(id_user) 之类的东西根本行不通。

至于 JDBC - postgres jar 包含在 GlassFish 域的 /lib 中。

至于 JSON - 我使用在这里找到的 org.json:https ://github.com/douglascrockford/JSON-java

4

2 回答 2

0

你应该很少使用单例(最好不要使用它们)。作为替代使用应用程序范围的bean(@Singleton bean 应该正常工作 - 他们应该使用实例变量,而不是静态变量)。

使用 Java EE 6,您还可以使用 CDI,因此如果您不需要 EJB 提供的附加功能(如自动事务划分、安全等),或者可以自己添加这些功能,则不必使用它们。

此外,您可以在 SE 应用程序中使用 CDI。但请记住,您需要定义 CDI bean 的范围(例如@Application、@Request 等),否则使用默认范围(@Dependant)会导致在每次访问时复制 bean。

于 2012-04-23T15:04:15.050 回答
0

我发现我的几个单例的静态实例变量没有正确创建——类加载器在SingletonClass.getInstance()从 servlet 调用时生成了一堆。

首先,您应该向我们展示其中一个单例类的代码。您可能在实现中犯了导致此问题的错误。

确实,您可以在 servlet 框架中获得看似(正确实现的)单例类的多个实例。但事实上,它们并非表面上看起来的那样。实际发生的情况是您已经从多个类加载器加载了该类,或者是因为您有多个 Web 应用程序每个都加载该类,或者因为您正在重新部署您的 Web 应用程序并且之前的部署没有正确清理。

那么你能/能做些什么呢?

  • 您可以使用依赖注入框架来配置您的 webapp,从而避免需要单例类。

  • 您可以继续使用单例,但要找出您获得多个实例的原因,并解决该问题。

于 2012-04-23T15:12:16.210 回答