2011-01-12 60 views
1

场景:的Java EE/GlassFish的 - 线程和连接

我一直在使用Java SE相当长的一段时间,随着螺纹等工作,虽然我使用Java EE的经验。

我有一个连接到远程服务器(在第三方公司)的第三方Java库。该库创建了几个线程,并保持连接自己活着。 我不允许反复打开新的连接(通过创建库的新实例)。我需要保持图书馆的同一个实例,以便随时保持连接。

这在Java SE应用程序中非常容易。

现在,我想创建一个Web服务(可能使用GlassFish或类似的)在我的公司内部使用,以便能够使用它的连接功能。 换句话说,我需要一个自定义的远程连接(不是由我的代码创建或管理)在请求实例之间保持活动状态。

问题: 这可能实现吗?如果是这样,我应该看看哪种技术?

+0

你的意思是数据库连接? – 2011-01-12 12:51:10

+0

不,它是专有的第三方套接字连接。我不能使用JDBC或类似的东西。 – 2011-01-12 13:06:49

回答

2

你可以使用连接池做到这一点。当连接远程服务器需要连接时,从该池中获取连接,而不是每次都实例化。这将有助于保持更好的内存足迹和效率。如果连接不是如果使用时间更长,您可以将连接返回到池。

1

我最近实现了一个类似的系统,使用Tomcat作为Servlet Container和Metro 2.0作为JAX-WS实现。我的服务维护与后端组件(用C++实现)的套接字连接,并使用专有网络协议与它们进行通信。

我使用'组件管理器'线程来管理与组件(连接建立,握手等)以及管理与组件的实际通信的'网络选择器'线程的高级通信。这个'网络选择器'使用异步非阻塞套接字使用Java Socket Selector类系列 - 使用单线程与套接字选择器类交互是非常重要的一点,因为一些Java平台在使用多线程时会出现错误。

到目前为止它工作得很好,所以我可以告诉你,这当然有可能。如果您需要任何澄清,然后请张贴在这里或通过电子邮件发送给我(请参阅我的个人资料)。

+0

非常感谢您的快速回答!但是,我自己无法控制这些关系。专有库正在创建线程并打开连接。实际上,这些线程似乎在请求实例之间保持运行,但我不确定如何在没有序列化的情况下将引用分享给库实例。 – 2011-01-12 13:20:30

+0

噢好吧 - 可能会更容易一些 - 也许您可能需要一个“管理器线程”来管理这些连接线程。关键是您需要在初始化期间创建一个线程,以独立于请求/响应工作流来管理后端资源。 – trojanfoe 2011-01-12 13:27:09

0

您需要有一个工厂来维护连接,然后通过JNDI以与提供JDBC连接池相同的方式提供它。

然后您需要确保连接返回到所述工厂,然后将其集成到应用程序服务器生命周期中,以便以编程方式上下拉动连接。

请注意,如果你不小心,潜伏在这里有一个讨厌的类加载器问题。你将不得不为工厂和客户端提供一个公共类,如果它不是标准运行时库中的一个,那么你需要找出一种方法让它正确共享,除非你想使用反射来获取方法。