当前位置: 首页 > 知识库问答 >
问题:

在JBoss AS 7中访问EJB时出现问题。来自Tomcat 6的x

苍烨然
2023-03-14

我试图从运行在Tomcat 6下的Servlet对JBoss中运行的EJB进行一些远程调用,作为7.1.1 final。EJB是封闭源代码,可以从一些给定的JAR(封闭代码)访问,JAR使用委托模式包装对无状态bean的访问。

在为jndi查找的正确配置挣扎了几天之后,我发现了不同的配置,这些配置都会产生不同的问题。

解决方案A:

由于Tomcat 6有自己的jndi,只需放置一个jndi。类路径中的属性(例如,如果从简单java应用程序访问EJB,它可以正常工作)不起作用。相反,我将哈希表中的属性传递给委托的构造函数,如下所示:

Hashtable<String, String> jndiProperties = new Hashtable<String, String>();
jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.as.naming.interfaces:org.jboss.ejb.client.naming");
jndiProperties.put(Context.PROVIDER_URL, "remote://10.10.10.10:4447");
jndiProperties.put(Context.SECURITY_PRINCIPAL, "user");
jndiProperties.put(Context.SECURITY_CREDENTIALS, "password");

Delegate someDelegate = new DelegateImpl(jndiProperties);

这会导致以下异常(在简单java应用程序中执行相同操作时不会发生):

java.lang.IllegalStateException: No EJB receiver available for handling [appName:eex,modulename:eex-ejb,distinctname:] combination for invocation context 

一些研究建议我试试。。。。

解决方案B:

添加了以下行:

jndiProperties.put("jboss.naming.client.ejb.context", "true");

现在查找和远程调用工作正常,但在某些调用之后,我会得到以下异常(从简单的java应用程序执行相同操作时也会发生这种情况):

org.jboss.remoting3.ProtocolException: Too many channels open

据我所知,使用jboss。命名。客户ejb。context设置为true时,会为JBoss上的每个查找创建一个新的EJBClientContext作为side,并且似乎委托没有正确关闭它。下面详细说明了如何正确关闭https://docs.jboss.org/author/display/WFLY8/ScopedEJB客户端上下文。

由于我没有委托源代码,因此无法正确关闭上下文。

所以我试着...

解决方案C:

有一种完全不同的查找方法:通过提供jboss ejb客户端。xml而不是jndi。属性。这与tomcat配合使用效果很好,在这种配置下查找也很好:

remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.port=4447
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
remote.connection.default.host=10.10.10.10
remote.connection.default.username=user
remote.connection.default.password=password

但是,使用此配置时,我会不时遇到以下异常(目前我无法再现,该异常只是偶尔发生):

ERROR: JBREM000200: Remote connection failed: the timeout for the connection expired
...and some lines later...
Caused by: java.io.IOException: Channel Channel ID 841ded9c (outbound) of Remoting connection 00dcc89a to null has been closed

非常感谢您的帮助。。。

共有2个答案

穆仲卿
2023-03-14

因此...我也有这个问题(和其他问题),我将在这里尝试解释(我不知道是否用正确的术语)我打算做什么以及我如何解决,它对我有用。我们进行了几次远程ejb调用,最终我们遇到了以下问题:

导致:java.io.IOException:通道通道ID fa8f69c7(出站)的Remting连接0196f4b5到null已关闭(https://developer.jboss.org/thread/198390)

这是由于远程调用没有管理上下文,因此JBoss本身负责自动管理通信通道。但是随着时间的推移,这个连接是空闲的,最终由于已知或未知的原因(防火墙、上传新版本时的连接限制)而“丢失”了这个连接

为了解决第一个问题,我查看了以下文档:

https://docs.jboss.org/author/display/WFLY8/ScopedEJB客户端上下文

放置以下属性后:

props.put ("org.jboss.ejb.client.scoped.context", "true");

然后,我们管理ejb范围,以便打开和关闭通信通道。所以我遇到了另一个问题:

无法识别的SSL消息,明文连接

理论上,这是因为服务器默认不支持ssl通信。要解决此问题,必须放置以下属性:

props.put ("remote.connection." + ConnectionName "+ connect.options.org.xnio.Options.SSL_ENABLED", "false");

(必须以相同的方式填写主机和端口)

然后我们陷入另一个问题:

Invalid option 'org.xnio.Options.SSL_ENABLED' in property 'remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED': java.lang.IllegalArgumentException: Class 'org.xnio.Options' not found

这是由于缺乏对XNIO的依赖。您可以将jboss ejb客户端的依赖关系放在pom上解决(在我的例子中,我使用jboss作为ejb客户端bom),但对我来说,它部分解决了问题。当它出现在不同的耳朵中时,我遇到了相同的问题,直到最后我将此配置放在jboss部署结构中。要导出依赖项的xml:

<jboss-deployment-structure>
  <deployment>
    <dependencies>
      <module name = "org.jboss.xnio" export = "true" />
    </dependencies>
  </deployment>
</jboss-deployment-structure>

最后看到这个类,它可以实例化SSL\u ENABLED并将其设置为false。现在我手动管理ejb范围,可以打开和关闭通道,解决闭合连接问题。

希望有帮助。

太叔经赋
2023-03-14

好了,我终于可以解决我的问题了。

我仍然不知道解决方案A的问题的答案。

我描述了解决方案B可能存在的问题。

解决方案C的异常是由我们的防火墙引起的,它在几分钟不活动后删除了会话表条目。我通过添加

remote.connection.default.connect.options.org.jboss.remoting3.RemotingOptions.HEARTBEAT_INTERVAL=60000

去jboss-ejb-client.properties.

这会导致客户端每分钟向JBoss发出一次“ping”,从而防止防火墙删除会话条目。

 类似资料:
  • 我可以通过本地J控制台访问Mbean,但无法从远程主机访问MBEANS。 我的配置: 远程进程:服务:jmx:远程处理-jmx://10.32.222.111:4447 我将用户添加到管理和应用领域 测试=2b1be81e1da41d4ea647bd82fc8c2bc9 但当我尝试连接它说:连接失败:重试 当我使用远程进程为:10.32.222.111:4447在服务器上提示警告: 16: 29:

  • 问题内容: 我在我们的内部网络上有一个简单的Web服务。我使用SOAPUI进行了一些测试,从WSDL生成了服务类,并编写了一些Java代码来访问服务。正如我能够创建服务代理类和进行调用一样,一切都按预期进行。很简单的东西。唯一的障碍是让Java信任来自提供Web服务的计算机的证书。那不是技术问题,而是我缺乏基于SSL的Web服务的经验。现在到我的问题。我编写了一个简单的EJB服务并将其部署到JBo

  • 19.2. 访问EJB 19.2.1. 概念 为了调用一个本地或者远程无状态session bean上的方法,通常客户端的代码必须进行JNDI查找,获取(本地或远程的)EJB Home对象,然后调用该对象的"create"方法,才能得到实际的(本地或远程的)EJB对象。如此一来,调用的方法比调用EJB组件本身的方法还要多。 为了避免重复的底层代码,很多EJB应用使用了服务定位器(Service L

  • 我正在创建一个程序,它从一个文件中获取输入(在我的例子中,是学生姓名及其相关联的编号),并以预购形式(使用/iterator)、后置+后置形式(使用/recursive)打印出来。在我的驱动程序中,我已经成功地创建和添加了学生的名字+关联号码+用预购迭代器打印出来。然而,我的问题是当我尝试打印这两个递归方法时,我得到一个“Void type not allowed here”错误。这两个方法存储在

  • 我遵循了Head First Servlets中一个非常简单的例子。 我在浏览器地址栏输入localhost:8080,显示的是Tomcat的主页,服务器好像没问题。然后我创建了一个名为< code>Ch1Servlet的servlet。它看起来是这样的: 接下来,需要一个web.xml的配置文件。所以是这样的: 在编译了Ch1Servlet.java之后,我得到了一个类文件,它被放在WEB-IN

  • 如果我没有使用spring构建图形,那么是否可以使用spring框架完全访问我的neo4j图形?我正在尝试一些示例,但它似乎无法正常工作,因为spring创建的某些元数据不存在。 编辑:例如,我有这个错误当我试图通过它的id访问一个节点时,即