在J2EE服务器中两个不同应用程序之间匹配两个对象实例的最佳方法是什么?

时间:2008-10-30 23:05:25

标签: java java-ee distributed

我有一个J2ee应用程序,其中我基本上需要两个对象,由两个独立的servlet直接通信创建,我需要这些内容稳定,即在会话期间互相“知道”。

序列大致为:

  1. 客户端向Servlet#1发送请求,该请求创建对象A
  2. 客户端向servlet#2发送第二个请求(在第一次返回之后),该请求创建对象B.
  3. 对象B使用JNDI找到A,并且两个对象进行交互。
  4. 客户端现在继续向对象A发送请求,该对象需要再次找到B.
  5. 如何在整个会话期间确保这两个实例都知道? 将它们绑定到JNDI并不能完全解决问题,因为对象B需要与其原始servlet(servlet#2)进行通信,而servlet在请求之间不能保持稳定。

    有什么想法吗?

    提前致谢。


    是的,我承认问题描述有点模糊。但这不是一个非常简单的应用程序。 不过,我会试着更好地问它:

    我的最终目标是为我的应用程序创建一种“语义调试器”,而不是简单地调试java语句的java调试器。

    调试的应用程序基本上是一个servlet。我的工具连接到哪个。 该工具通过另一个控制调试过程的servlet维护与应用程序的连接。 这两个servlet需要不断地直接相互通信。

    我目前的想法是建立一个有状态的会话bean来促进这种沟通(从来没有做过,仍然在努力设置它)。

    但我很感激有关如何更好地实现这一目标的任何想法。

2 个答案:

答案 0 :(得分:1)

是什么阻止你使用Session?您不需要JNDI,只需将对象置于预定义名称下的会话中即可。如果通信对象是应用程序范围的,请使用Singleton。

P.S。它看起来你在做一些奇怪的事情,而解决方案实际上可能更简单。你能描述一下这项任务,而不是拟议的实施吗?无论如何,什么是“语义调试器”?

答案 1 :(得分:0)

说实话:我并不完全明白你想要达到的目的。 您是否可以尝试解释您尝试解决的问题而不是解决方案?

这些对象依赖于什么?他们是用户特定的吗?然后将它们放入会话中,您可以再次从会话中检索它们(request.getSession()。getAttribute(“A”))。

它们对所有用户都是全球性的吗?在这种情况下,将它们放入弹簧配置并从那里检索它们。

永远不要在servlet中存储任何信息。

编辑: 好的,所以根据我的理解,在会话中存储值是imho解决这个问题的最佳方法(在“Java-Pseudo-Code”中):

public class BusinessServlet {

protected void doGet(HttpServletRequest req, HttpServletResponse res)  {
  HttpSession session = req.getSession(true);
  BusinessCode business = session.getAttribute("A");
  if (business == null) {       
    business = new BusinessCode();
    session.setAttribute("A", business);
  }

  DebugObject debug = session.getAttribute("B");
  if (debug == null) {       
    debug = new DebugObject();
    session.setAttribute("B", debug);
  }

  business.doSomeWork(debug); 
  }
} 

public class DebugServlet {
  protected void doGet(HttpServletRequest req, HttpServletResponse res)  {
    HttpSession session = req.getSession(true);
    DebugObject debug = session.getAttribute("B");
    if (debug != null) {
      debug.printDebugMessages(res);
    }
  }
} 

这有帮助吗?