Java EE和应用服务器 - 我能做些什么?

4
我决定现在深入了解Java EE。我在Java SE中使用EE一些技术,比如JPA或JMS,但我仍然在Java SE中瞎搞,我相信Java EE和应用服务器将解决我遇到的一些问题。
但是:在阅读了一些网上的文章之后,我仍然有一些问题。
1. 我是否只能请求响应应用程序?我有一个通过HTTP提供XML文档的应用程序。所有交付的对象都添加到队列中,并将在不同的线程中分派。对这些对象进行了一些验证,包括打开到远程机器的套接字(我听说EJ-Beans不能这样做,这是真的吗?)。那么,在应用服务器内部是否可以做到这一点?
2. 我知道有消息驱动的bean,是否可以从应用服务器外部发送JMS消息到MDB?我有一个服务发送JMS消息,但作为传统系统,它不在同一个应用服务器中运行。
3. 系统管理员或用户如何配置我的应用程序?我知道一些东西,比如数据库连接是在应用服务器中配置的,我的应用程序可以通过JNDI查找它们或通过DI获取它们。但是应用程序特定的配置呢?
这些都是相当新手的问题,但也许有人有时间向我解释所有这些东西是如何工作的。 :)
顺祝商祺, Posix
PS:
4. 看起来EJB不能做任何与文件有关的事情,因此Java EE似乎不适用于接收文件、将它们推到不同系统并希望它们写入套接字的服务(参见问题1)。
5个回答

2
我可以说,在你的情况下,Java EE是可以毫无疑问地使用的。让我更深入地解答一下你的具体问题:
  1. 你可以从你的EJB中打开套接字连接。没有任何阻止你这样做。但是,这种操作不建议在Java EE应用程序中使用。在我看来,更好的选择是实现Java EE连接器(JCA),它将管理针对你专有系统的套接字连接池。这是按规范实现这种集成的模式方式。
  2. 是的!完全可以接收来自外部应用程序/系统(AS外)发送的消息。这是使用消息传递进行集成的主要思想 :) 在许多情况下,作为Java EE应用程序,您通过MDB从JMS通道接收消息,但是JMS仅是一个API,并且可以由任何消息系统(例如IBM MQ)实现。在此架构中,外部系统将MQ消息放入队列中,而侦听该队列的Java EE应用程序通过JMS API接收消息!
  3. 一般来说,应用服务器为管理员提供了管理Java EE资源(例如数据源、JMS连接工厂、JMS目标、JTA事务管理器等)的强大工具。如果需要更改特定的Java EE应用程序,则最好的选择似乎是JMX。只需实现几个MBean,将其导出到嵌入在应用服务器中的JMX服务器中,就可以完成此任务。在JBoss等应用服务器中,这个任务非常简单,但是现代应用服务器现在提供了广泛的JMX功能。
  4. 乍一看,EJB似乎不是处理文件的最佳选择。但是请记住,你的EJB的实现仍然是纯Java编写的,因此没有任何阻止你读取/流式传输文件等操作。我有使用大型Java EE应用程序处理大型输入文件的经验,并可以向你保证Java EE是一个很好的技术选择 :)

文件的问题在于它们不可集群化或可扩展(也就是说,如果出现故障转移场景,您将丢失文件),因此,如果您需要这种可扩展性和容错性,那么您需要将文件处理器隔离到某种上下文之外,而不是 J2EE 容器。如果您只在简单的单实例 J2EE 容器中运行,并且应用服务器允许,则完全没有问题。 - Yishai
Yoshai,可扩展性和容错性是文件系统选择的问题。可以使用现代容错(并行)分布式文件系统,为您提供很多便利。在JEE应用程序中处理文件和套接字时失去的东西是应用服务器(JTA)管理的事务。从我的经验来看,事务(特别是XA基础设施)是可靠的JEE应用程序的关键特性之一。 - Tomasz Błachowicz

0
  • 对文件进行任何操作都违反了EE规范(以确保EE应用程序具有可移植性和可分发性)。但是,由于这只是普通的Java代码,您可以选择自己想要做的任何事情。只要您知道目标环境的外观(例如系统供内部使用),我不会因为规范而犹豫修改文件。

  • 0
    在像Tomcat这样的应用服务器中(可能还有其他的,但我从未使用过),你不仅可以在接收请求时执行操作,还可以在服务器启动时执行操作(包括启动长时间运行的线程)。基本上你可以使用“普通”的Java做任何事情。实际上,如果你在应用服务器中包含一个调用适当的main()函数的代码片段,则可以将普通的Java应用程序放入应用服务器中。

    0

    这里是EJB 1.1规范的限制。

    以下是我的回答:

    1. 我认为EJB可以在远程机器上打开套接字,但我认为打开套接字是太低级的操作了。我会考虑将套接字所做的任何事情公开为另一个EJB。
    2. MDB只是注册到特定主题或队列的监听器。它并不涉及发送任何内容。如果客户端知道如何将消息发送到队列,则可能会实现。他们只需要知道队列URL并能够创建连接即可。
    3. 管理员设置连接池、JNDI名称等所有内容。他们使用应用服务器的管理控制台进行设置。

    0

    我建议将每种技术应用于您当前感到疼痛的适当点。 关于您特定的问题:

    1. 在EE上下文中,您可以将消息添加到具有MDB的JMS队列中,这些MDB将执行实际处理。关于管理HTTP请求/响应生命周期,您可以像现在一样管理它,或者使用现有库为您完成管理。通过转移到EE应用程序服务器,您将允许应用程序服务器管理线程,事务等,而无需手动管理。

    2. 如duffymo所述,MDB负责接收消息,它们不关心消息来自何处。

    3. 系统管理员可以像duffymo所述那样配置应用程序服务器。此外,您可以向其他系统或最终用户公开JMX bean,以允许他们根据需要配置服务。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接