在Java中使用HTTP-MMO游戏的麻烦

时间:2012-04-23 14:58:40

标签: java http java-ee singleton mmo

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

我是用Java EE风格编写的,希望移植到Java EE并不困难。但后来我发现我的几个sinleton的静态实例变量没有正确创建 - 当从servlet调用SingletonClass.getInstance()时,classloader会创建一堆它们。

我非常绝望,并认为添加@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

2 个答案:

答案 0 :(得分:0)

你应该使用单身很少(最好不要使用它们)。作为替代方法,使用应用程序作用域bean(@Singleton bean通常应该可以工作 - 它们应该使用实例变量,而不是静态变量)。

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

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

答案 1 :(得分:0)

  

我发现我的几个单例的静态实例变量没有正确创建 - 在从servlet调用SingletonClass.getInstance()时,classloader创建了一堆它们。

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

确实,您可以在servlet框架中获得似乎是(正确实现的)单例类的多个实例。但实际上它们并不像它们看起来那样。实际上是你从多个类加载器加载了这个类,要么是因为你有多个webapps,每个加载一个类,要么是因为你正在重新部署你的webapp而前一个部署没有正确清理。

那么你能做什么/可以做些什么?

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

  • 您可以继续使用单身人士,但会追踪您获得多个实例的原因,并解决该问题。