在多个服务器上查找相同的EJB

时间:2014-04-03 13:13:49

标签: java spring jboss7.x java-ee-6 ejb-3.1

我正在尝试从一个部署到另一个部署进行查找,使用相同的bean实现。它基本上是一个消费者/生产者设置,在两台机器上的两个部署中都有相同的bean。

ear
    ejb-api
        com.example.bean
            ConsumerBean
            ProducerBean
    ejb-jar
        com.example.bean
            ConsumerBeanRemote
            ProducerBeanRemote

ProducerBeanRemote应该查找ConsumerBeanRemote并调用其公共方法。

我们的机器正在这样沟通:

(Machine A) ProducerBeanRemote --> (Machine B) ConsumerBeanRemote
(Machine A) ProducerBeanRemote --> (Machine C) ConsumerBeanRemote
(Machine A) ProducerBeanRemote --> (Machine D) ConsumerBeanRemote

你明白了......

所以问题是,它不起作用。我尝试使用jboss-as-ejb-client库进行手动查找,因为JBoss在启动其容器时锁定了EJB选择器,因此无法正常工作(我打赌规范在Java EE中有关于手动查找的说法环境)。我尝试的下一件事是使用Spring的功能进行查找,但无济于事。

我们正在使用JBoss Application Server 7.1.1.Final。

我打赌必须有办法完成我的设置,我非常感谢社区提供的任何帮助。

更新

要从ProducerBeanRemote连接到ConsumerBeanRemote,我们需要通过配置在运行时指定远程InitialContext。

Properties properties = new Properties();
properties.put("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED", "false");
properties.put("remote.connections", "default");
properties.put("remote.connection.default.host", "remote-host");
properties.put("remote.connection.default.port", "4447");
properties.put("remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS", "false");

EJBClientConfiguration ejbClientConfiguration = new PropertiesBasedEJBClientConfiguration(properties);
ContextSelector<EJBClientContext> ejbClientContextSelector = new ConfigBasedEJBClientContextSelector(ejbClientConfiguration);
EJBClientContext.setSelector(ejbClientContextSelector);

StatelessEJBLocator<T> locator = new StatelessEJBLocator<>(viewType, appName, moduleName, beanName, distinctName);
return EJBClient.createProxy(locator);

产生的异常是

java.lang.SecurityException: EJB client context selector may not be changed at org.jboss.ejb.client.EJBClientContext.setSelector(EJBClientContext.java:181)

我们知道由于https://issues.jboss.org/browse/AS7-2998引发了这个异常,所以问题仍然存在:我们如何以干净和可配置的方式远程调用相同的bean?

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

几乎与此处描述的问题相同:JNDI lookup from one server to many configurable servers

似乎不可能通过EJB获得多个服务器之间的依赖连接,因此我们最终使用JMS进行服务器到服务器的通信。也许这也是你的选择。

答案 2 :(得分:0)

可以进行设置。没有必要使用JMS重新设计整个代码。

可以使用您自己的EJBClientContext自定义选择器从单个POJO客户端调用不同JBOSSAS7服务器上的远程ejb bean。使用上面提到的代码,您可以为不同的服务器注册不同的范围

请参阅jboss开发人员的示例

https://community.jboss.org/thread/223419?tstart=0

https://github.com/wfink/jboss-as-quickstart/blob/ejb-clients/ejb-clients/jboss-api/src/main/java/org/jboss/as/quickstarts/ejb/clients/selector/CustomScopeEJBClientContextSelector.java