EJB客户机上下文选择器可能不会更改 [英] EJB client context selector may not be changed

查看:193
本文介绍了EJB客户机上下文选择器可能不会更改的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 我正在尝试访问在jbossAS7.1中暴露的ejb,最终属性jndiProperties = new Properties(); 
jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY,org.jboss.naming.remote.client.InitialContextFactory);
jndiProperties.put(Context.PROVIDER_URL,remote://127.0.0.1:4447);
jndiProperties.put(jboss.naming.client.ejb.context,true);
jndiProperties.put(jboss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT,false);
jndiProperties.put(Context.SECURITY_PRINCIPAL,ubiant);
jndiProperties.put(Context.SECURITY_CREDENTIALS,ubiant2iA);
ctx = new InitialContext(jndiProperties);

对象b = ctx.lookup(ejb:Hemis / HemisCoreClient //+HardwareDataManagement+!+com.ubiant.hemis.client.ejb.interf.I_HardwareDataManagement);

但是我收到这个异常:
EJB客户端上下文选择器可能不会更改



有人可以帮助我吗?



这里是完整的堆栈跟踪:


11:17:43,003错误[stderr](qtp10117087-119)
javax.naming.NamingException:无法创建远程连接
[根异常是java.lang.RuntimeException:无法设置EJB
远程上下文]



11:17:42,711错误[stderr](qtp10117087-119)
org.jboss.naming.remote.client.ClientUtil.namingException(ClientUtil.java:36)



11:17:42,911错误[stderr](qtp10117087-119 )at
org.jboss.naming.remote.client.InitialContextFactory.getInitialContext(InitialContextFactory.java:121)



11:17:42,912错误[stderr] (qtp10117087-119)at
javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)



11:17:在
javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)



11:17:43,812错误[stderr](qtp10117087-119)at
javax.naming.InitialContext.init(InitialContext.java:242)



11:17:42,912错误[stderr ](qtp10117087-119)at
javax.naming.InitialContext。(InitialContext.java:216)



11:17:42,912错误[stderr](qtp10117087 -119)at
authentification.TokenAuthentificationBroker.addConnection(TokenAuthenticationBroker.java:86)



11:17:42,912 ERROR [stderr](qtp10117087-119)at
org.apache.activemq.broker.MutableBrokerFilter.addConnection(MutableBrokerFilter.java:97)



11:17:42,912错误[stderr](qtp10117087-119 )at
org.apache.activemq.broker.TransportConnection.processAddConnection(TransportConnection.java:733)



11:17:42,912错误[stderr](qtp10117087 -119) at
org.apache.activemq.broker.jmx.ManagedTransportConnection.processAddConnection(ManagedTransportConnection.java:79)



11:17:42,912 ERROR [stderr]( qtp10117087-119)at
org.apache.activemq.command.ConnectionInfo.visit(ConnectionInfo.java:139)



11:17:42,912错误[stderr ](qtp10117087-119)at
org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:292)



11:17:43,812错误$($)$($)
$ b $ p :$ 43

11
$。 :17:43,812 ERROR [stderr](qtp10117087-119)at
org.apache.activemq.transport.ws.MQTTSocket.sendToActiveMQ(MQTTSocket.java:112)



11:17:43,812错误[stderr]( qtp10117087-119)
org.apache.activemq.transport.mqtt.MQTTProtocolConverter.sendToActiveMQ(MQTTProtocolConverter.java:133)



11:17:43,812错误[stderr](qtp10117087-119)at
org.apache.activemq.transport.mqtt.MQTTProtocolConverter.onMQTTConnect(MQTTProtocolConverter.java:235)



11: 17:42,712 ERROR [stderr](qtp10117087-119)at
org.apache.activemq.transport.mqtt.MQTTProtocolConverter.onMQTTCommand(MQTTProtocolConverter.java:157)



<在
org.apache.activemq.transport.ws.MQTTSocket.onMessage(MQTTSocket.java:59)


$ p> 11:17:42,712错误[stderr](qtp10117087-119) b $ b

11:17:42,712
org.eclipse.jetty.websocket.WebSocketConnectionRFC6455 $ WSFrameHandler.onFrame(WebSocketConnectionRFC6455.java:860)中的错误[stderr](qtp10117087-119)



11:17:42,712 ERROR [stderr](qtp10117087-119)at
org.eclipse.jetty.websocket.WebSocketParserRFC6455.parseNext (WebSocketParserRFC6455.java:349)



11:17:42,712错误[stderr](qtp10117087-119)at
org.eclipse.jetty.websocket.WebSocketConnectionRFC6455 .handle(WebSocketConnectionRFC6455.java:225)



11:17:43,812错误[stderr](qtp10117087-119)at
org.eclipse.jetty.io .nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628)



11:17:43,812 ERROR [stderr](qtp10117087-119)at
org.eclipse .jetty.io.nio.SelectChannelEndPoint $ 1.run(SelectChannelEndPoint.java:52)



11:17:42,912 ERROR [stderr](qtp10117087-119)at
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)



11:17:42,912错误[stderr](qtp10117087-119 )at
org.eclipse.jetty.util.thread.QueuedThreadPool $ 3.run(QueuedThreadPool.java:543)



11:17:42,912错误[stderr ](qtp10117087-119)at
java.lang.Thread.run(Thread.java:745)



11:17:42,712错误[stderr](qtp10117087-119)导致:
java.lang.RuntimeException:无法设置EJB远程上下文



11:17:42,712 ERROR [stderr](qtp10117087-119)at
org.jboss.naming.remote.client.InitialContextFactory.setupEjbContext(InitialContextFactory.java:438)



11:17:42,712 ERROR [stderr](qtp10117087-119)at
org.jboss.naming.remote.client.InitialContextFactory.getInitialContext(InitialContextFactory.java:115)



11:17:42,712错误[stderr](qtp10117087-119)... 25更多



11 :17:43,512 ERROR [stderr](qtp10117087-119)引起的:
java.lang.reflect.InvocationTargetException



11:17:42,912错误[stderr ](qtp10117087-119)at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)



11:17:42,912 ERROR [stderr](qtp10117087-119 )at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeM ethodAccessorImpl.java:57)



11:17:44,028错误[stderr](qtp10117087-119)at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl。 java:43) b
$ b

11:17: java:606)

11:17: setupEjbContext(InitialContextFactory.java:420)



11:17:44,028错误[stderr](qtp10117087-119)... 26更多



11:17:41,828错误[stderr](qtp10117087-119)导致:
java.lang.SecurityException:EJB客户端上下文选择器可能不是
更改



11:17:42,728 ERROR [stderr](qtp10117087-119)at
org.jboss.ejb.client.EJBClientContext.setSelector(EJBClientContext.java:181) p>

11:17:42,728错误[stderr](qtp10117087-119)at
org.jboss.naming.remote.client.ejb.RemoteNamingEjbClientContextSelector.setupSelector(RemoteNamingEjbClientContextSelector.java:18)



11:17:41,828错误[stderr](qtp10117087-119 )... 31更多



解决方案

根据 https://developer.jboss.org/thread/273859 ,设置jboss.naming.client.ejb.context = true尝试创建一个EJB客户端上下文选择器,但它已经为JBoss EAP 6实例创建了,所以如果客户端在[JBoss]服务器内部运行,则不可能更改ejbSelector,就像您所做的那样。该线程中的建议是使用范围上下文功能( 7.5.4。使用Scoped EJB客户端上下文),以满足您的需求。



BTW,我在想另一种方法这可能是回到做一个本地(非远程)查找,依赖于您的代码最终在JBoss内部运行的事实,正如您最初在第一个问题(在jboss内部部署rar内部获取EJB对象)。但 https://developer.jboss.org/thread/273428 说你需要实现远程界面能够从不同的应用程序耳机/ jar中查找,所以我认为这不是一个可行的选择,而你正在接近它(做远程调用)的方式听起来像是正确的方法。 p>

编辑1,根据6/23/2017的评论:



关于 https://docs.jboss.org/author/display/AS72/Remote+EJB+invocations+via+JNDI+-+EJB+client+API+或+远程命名+项目,EJB只有在满足两个条件时才能远程暴露:


1)绑定在java:jboss / exports /
na之下mespace。例如,java:jboss / exported / foo / bar



2)绑定到java:jboss / exported / namespace的对象预计是可序列化的。
这允许通过电线将对象发送到远程客户端


当我查看显示EJB的日志时从您的原始问题注册,我看不到任何表明您尝试访问的EJB被绑定在 java:jboss / exported / 命名空间下。为了使远程查找工作起作用,我想您还需要了解如何在该命名空间下绑定EJB,以及使用范围上下文。


I am trying to access an ejb that is exposed in jbossAS7.1 from code running in an embedded jetty server:

final Properties jndiProperties = new Properties();
jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
jndiProperties.put(Context.PROVIDER_URL, "remote://127.0.0.1:4447");
jndiProperties.put("jboss.naming.client.ejb.context", true);
jndiProperties.put("jboss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT", "false");
jndiProperties.put(Context.SECURITY_PRINCIPAL, "ubiant");
jndiProperties.put(Context.SECURITY_CREDENTIALS, "ubiant2iA");
ctx = new InitialContext(jndiProperties);

Object b = ctx.lookup("ejb:Hemis/HemisCoreClient//" + "HardwareDataManagement" + "!" + "com.ubiant.hemis.client.ejb.interf.I_HardwareDataManagement");

But I am getting this exception: "EJB client context selector may not be changed"

Could someone help me with this ?

Here the full stacktrace:

11:17:43,003 ERROR [stderr] (qtp10117087-119) javax.naming.NamingException: Failed to create remoting connection [Root exception is java.lang.RuntimeException: Failed to setup EJB remote context]

11:17:43,011 ERROR [stderr] (qtp10117087-119) at org.jboss.naming.remote.client.ClientUtil.namingException(ClientUtil.java:36)

11:17:43,011 ERROR [stderr] (qtp10117087-119) at org.jboss.naming.remote.client.InitialContextFactory.getInitialContext(InitialContextFactory.java:121)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at javax.naming.InitialContext.init(InitialContext.java:242)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at javax.naming.InitialContext.(InitialContext.java:216)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at authentification.TokenAuthentificationBroker.addConnection(TokenAuthentificationBroker.java:86)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.apache.activemq.broker.MutableBrokerFilter.addConnection(MutableBrokerFilter.java:97)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.apache.activemq.broker.TransportConnection.processAddConnection(TransportConnection.java:733)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.apache.activemq.broker.jmx.ManagedTransportConnection.processAddConnection(ManagedTransportConnection.java:79)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.apache.activemq.command.ConnectionInfo.visit(ConnectionInfo.java:139)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:292)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:149)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.apache.activemq.transport.ws.MQTTSocket.sendToActiveMQ(MQTTSocket.java:112)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.apache.activemq.transport.mqtt.MQTTProtocolConverter.sendToActiveMQ(MQTTProtocolConverter.java:133)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.apache.activemq.transport.mqtt.MQTTProtocolConverter.onMQTTConnect(MQTTProtocolConverter.java:235)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.apache.activemq.transport.mqtt.MQTTProtocolConverter.onMQTTCommand(MQTTProtocolConverter.java:157)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.apache.activemq.transport.ws.MQTTSocket.onMessage(MQTTSocket.java:59)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.eclipse.jetty.websocket.WebSocketConnectionRFC6455$WSFrameHandler.onFrame(WebSocketConnectionRFC6455.java:860)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.eclipse.jetty.websocket.WebSocketParserRFC6455.parseNext(WebSocketParserRFC6455.java:349)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.eclipse.jetty.websocket.WebSocketConnectionRFC6455.handle(WebSocketConnectionRFC6455.java:225)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at java.lang.Thread.run(Thread.java:745)

11:17:43,012 ERROR [stderr] (qtp10117087-119) Caused by: java.lang.RuntimeException: Failed to setup EJB remote context

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.jboss.naming.remote.client.InitialContextFactory.setupEjbContext(InitialContextFactory.java:438)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at org.jboss.naming.remote.client.InitialContextFactory.getInitialContext(InitialContextFactory.java:115)

11:17:43,012 ERROR [stderr] (qtp10117087-119) ... 25 more

11:17:43,012 ERROR [stderr] (qtp10117087-119) Caused by: java.lang.reflect.InvocationTargetException

11:17:43,012 ERROR [stderr] (qtp10117087-119) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

11:17:43,012 ERROR [stderr] (qtp10117087-119) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

11:17:43,028 ERROR [stderr] (qtp10117087-119) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

11:17:43,028 ERROR [stderr] (qtp10117087-119) at java.lang.reflect.Method.invoke(Method.java:606)

11:17:43,028 ERROR [stderr] (qtp10117087-119) at org.jboss.naming.remote.client.InitialContextFactory.setupEjbContext(InitialContextFactory.java:420)

11:17:43,028 ERROR [stderr] (qtp10117087-119) ... 26 more

11:17:43,028 ERROR [stderr] (qtp10117087-119) Caused by: java.lang.SecurityException: EJB client context selector may not be changed

11:17:43,028 ERROR [stderr] (qtp10117087-119) at org.jboss.ejb.client.EJBClientContext.setSelector(EJBClientContext.java:181)

11:17:43,028 ERROR [stderr] (qtp10117087-119) at org.jboss.naming.remote.client.ejb.RemoteNamingEjbClientContextSelector.setupSelector(RemoteNamingEjbClientContextSelector.java:18)

11:17:43,028 ERROR [stderr] (qtp10117087-119) ... 31 more

解决方案

According to https://developer.jboss.org/thread/273859, "Setting jboss.naming.client.ejb.context = true tries to create an EJB client context selector but it is already created for the JBoss EAP 6 instance," so "It is not possible to change the ejbSelector if the client run inside the [JBoss] server", as you're doing. The recommendation in that thread is to use the scoped-context feature (7.5.4. Using Scoped EJB Client Contexts) for a situation like yours.

BTW, I was thinking that the other approach that might work is to go back to doing a local (non-remote) lookup that relies on the fact that your code is ultimately running inside of JBoss, as you were originally trying to do in your first question (Get EJB object inside rar deployed inside jboss). But https://developer.jboss.org/thread/273428 say "You need to implement the Remote interface to be able to look it up from a different application ear/jar," so I think that's not a viable option, and the way you're approaching it (doing a remote invocation) sounds like the right approach.

EDIT 1, based on the comment on 6/23/2017:

Based on the "Pre-requisites of remotely accessible JNDI objects" section of https://docs.jboss.org/author/display/AS72/Remote+EJB+invocations+via+JNDI+-+EJB+client+API+or+remote-naming+project, EJBs are only remotely exposed when they satisfy two conditions:

1) Such objects should be bound under the java:jboss/exported/ namespace. For example, java:jboss/exported/foo/bar

2) Objects bound to the java:jboss/exported/ namespace are expected to be serializable. This allows the objects to be sent over the wire to the remote clients

When I look at the logs showing EJBs being registered from your original question, I don't see anything to indicate that the EJB you're trying to access is being bound under the java:jboss/exported/ namespace. For the remote lookup to work, I think you'll also need to figure out how to bind your EJB under that namespace, in addition to using a scoped context.

这篇关于EJB客户机上下文选择器可能不会更改的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆