2011-04-17 108 views
1

在消息驱动Bean我是仅限于会话Bean的同样的规则(EJB3或EJB3.1),即:消息驱动Bean(MDB)与其他EJB Bean绑定到相同的限制吗?

  • 使用java.lang.reflect中的Java反射API来访问的方式不可用的信息的Java运行时环境
  • 读或写非最终静态字段
  • 使用这指的是例如在方法参数或导致
  • 访问包(和类),它们另有不可用的安全规则Java编程语言规则
  • 在包中定义类
  • 使用java.awt包来创建用户界面
  • 创建或修改的类加载器和安全管理器
  • 重定向的输入,输出和错误流
  • 获得安全策略对于代码源
  • 访问信息或修改安全配置对象
  • 创建或管理线程
  • 使用线程同步ronization元同步与其他企业bean实例访问
  • 停止Java虚拟机
  • 负载的本地库
  • 监听,接收组播上的连接,或从网络套接字在Java中
  • 变化套接字工厂。 net.Socket或java.net.ServerSocket,或更改java.net.URL的流处理程序工厂。
  • 直接读取或写入文件描述符
  • 创建,修改,或在文件系统中
  • 使用Java序列化协议

回答

2

的子类和对象替换功能它始终是一个好主意,删除文件不要手动创建线程(ExecutorService在某些情况下似乎很好)。

实际上,MDB经常用于解决这个限制:不是创建一个单独的线程,而是发送一些任务对象(将MyJob extends Serializable放入ObjectMessage中)放入队列,并让它在MDB线程池中执行。这种方法更重量级,但扩展性非常好,而且您不必手动管理任何线程。在这种情况下,JMS只是异步运行作业的一种奇特方式。

+0

我面临的问题是我创建了一个应用程序,提供插件的第三方开发人员。其中一些插件使用Apache HTTP Client,它通常用于多线程模式。此时此代码在无状态会话Bean中执行,但由于HTTP客户端中的线程操作,应用程序将突然冻结并将不得不重新启动应用程序服务器。不知道如何解决这个问题,因此我在寻找JMS/MDB – 2011-04-17 18:40:37

0

这些EJB限制通常不是硬限制。事实上,他们不是在做你的EJB 工作适当的警告,他们更像是如何使你的EJB 便携式跨EJB容器公告。

有时候,一些非常挑剔的EJB容器提供者(咳嗽.... WebSphere ...咳嗽)实际上会通过java安全策略强制执行这些限制,但我会说大约有一半限制被忽略(我的意思是在您的MDB中使用log4j可能违反其中约30%)。

违反其他70%可能表示一些架构或设计问题。

那么,你可以在MDB中调用System.exit()answer是的,但只有一次... :)

这听起来像,在你的情况下,你需要这些限制可能会导致可能行为不端的插件。我不知道MDB是否会让你摆脱这个问题。我认为这取决于你对第三方开发者的信任程度,而不是在EJB中使用基于调用的模型,而是将组件安装为JMX ModelMBeans。您可以使用java安全模型来限制他们可以做的事情,但我认为这会挫败目的。

也许使用一些运行(或加载)时间的AOP字节代码工程,您可以重写所有线程请求以重定向到您分配的每个组件线程工厂,并限制可创建的线程。因为您不想阻止他们做他们所做的任何事情,所以您不希望他们在崩溃/失速/行为不当时取下整个服务器。

有趣的问题。