2017-04-21 110 views
0

我試圖通過客戶端訪問遠程Wildfly 10.x服務器上的EJB,但我無法讓它工作。再次從遠程客戶端調用EJB

我已經看到thisthis,this,this和許多其他帖子,但它仍然不起作用。

根據上述帖子中的建議,我有兩個Java代碼版本引發「無法註冊EJB」或「無法連接到服務器」。

也許問題出在服務器配置上,但我不是這裏的專家。

我真的很感激任何幫助。

我部署的EJB上WildFly 10.1遠程服務器:

java:global/Remote/EJB-Remote-Demo-ejb-1.0/CalculatorBean!com.maggioni.Stateless2.RemoteCalculator 
java:app/EJB-Remote-Demo-ejb-1.0/CalculatorBean!com.maggioni.Stateless2.RemoteCalculator 
java:module/CalculatorBean!com.maggioni.Stateless2.RemoteCalculator 
java:jboss/exported/Remote/EJB-Remote-Demo-ejb-1.0/CalculatorBean!com.maggioni.Stateless2.RemoteCalculator 
java:global/Remote/EJB-Remote-Demo-ejb-1.0/CalculatorBean 
java:app/EJB-Remote-Demo-ejb-1.0/CalculatorBean 
java:module/CalculatorBean 

服務器配置:

<subsystem xmlns="urn:jboss:domain:remoting:3.0"> 
     <endpoint/> 
     <http-connector name="http-remoting-connector" connector-ref="default" security-realm="ApplicationRealm"/> 
</subsystem> 

POM的配置:

<dependency> 
      <groupId>org.wildfly</groupId> 
      <artifactId>wildfly-ejb-client-bom</artifactId> 
      <version>10.1.0.Final</version> 
      <type>pom</type> 

     </dependency> 

我有現在的兩個版本我碼。

版本1:

private static RemoteCalculator lookupRemoteStatelessCalculator() throws NamingException { 
     final Hashtable jndiProperties = new Hashtable<>(); 
     jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); 
     jndiProperties.put("jboss.naming.client.ejb.context", true); 
     final Context context = new InitialContext(jndiProperties);    
     String appName = "Remote/" 
     String moduleName = "EJB-Remote-Demo-ejb-1.0/"; 
     String beanName = CalculatorBean.class.getSimpleName(); 
     String viewClassName = RemoteCalculator.class.getName(); 
     final String jndiname = "ejb:" + appName + moduleName + "/" + beanName + "!" + viewClassName; 
     System.out.println("jndiname is : " + jndiname); 
     return (RemoteCalculator) context.lookup(jndiname); 
    } 

這個版本是引發錯誤「無法註冊一個EJB接收器」

Apr 21, 2017 10:44:47 AM org.jboss.ejb.client.remoting.ConfigBasedEJBClientContextSelector setupEJBReceivers 
WARN: Could not register a EJB receiver for connection to <myEnvironmentNumber>.jelastic.dogado.eu:4447 
java.net.ConnectException: Connection refused: no further information 
    ........ 
Exception in thread "main" java.lang.IllegalStateException: EJBCLIENT000025: No EJB receiver available for handling [appName:Remote, moduleName:EJB-Remote-Demo-ejb-1.0, distinctName:] combination for invocation context [email protected] 
    at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:798) 

版本2:

private static RemoteCalculator lookupRemoteStatelessCalculator() throws NamingException { 
     Properties jndiProperties = new Properties(); 
     jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); 
     jndiProperties.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory"); 
     jndiProperties.put(javax.naming.Context.PROVIDER_URL, "http-remoting://<myEnvironmentNumber>.jelastic.dogado.eu:4447"); 
     jndiProperties.put(javax.naming.Context.SECURITY_PRINCIPAL, "app"); 
     jndiProperties.put(javax.naming.Context.SECURITY_CREDENTIALS, "app"); 
     jndiProperties.put("jboss.naming.client.ejb.context", true); 
     final Context context = new InitialContext(jndiProperties); 
     String appName = "Remote/"; 
     String moduleName = "EJB-Remote-Demo-ejb-1.0/"; 
     String beanName = CalculatorBean.class.getSimpleName(); 
     String viewClassName = RemoteCalculator.class.getName(); 
     final String jndiname = appName + moduleName + beanName + "!" + viewClassName; 
     System.out.println("jndiname is : " + jndiname); 
     return (RemoteCalculator) context.lookup(jndiname); 
    } 

這個版本是引發錯誤「無法連接到任何服務器」

Apr 21, 2017 9:42:10 AM org.xnio.Xnio <clinit> 
INFO: XNIO version 3.4.0.Final 
Apr 21, 2017 9:42:10 AM org.xnio.nio.NioXnio <clinit> 
INFO: XNIO NIO Implementation Version 3.4.0.Final 
Apr 21, 2017 9:42:11 AM org.jboss.remoting3.EndpointImpl <clinit> 
INFO: JBoss Remoting version 4.0.21.Final 
jndiname is : Remote/EJB-Remote-Demo-ejb-1.0/CalculatorBean!com.maggioni.Stateless2.RemoteCalculator 
Exception in thread "main" javax.naming.CommunicationException: Failed to connect to any server. Servers tried: [http-remoting://<myEnvironmentNumber>.jelastic.dogado.eu:4447 (java.net.ConnectException: Connection refused: no further information)] 

兩個版本的jboss-ejb-client.properties正在尋找這樣的:

remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false 
remote.connections=default 
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false 
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false 

remote.connection.default.host=<myEnvironmentNumber>.jelastic.dogado.eu 
remote.connection.default.port = 4447 
remote.connection.default.username=app 
remote.connection.default.password=app 

編輯:

我想這個問題可能與用戶配置WildFly。不幸的是,我不能使用腳本來設置用戶,所以我必須直接將它輸入到application-users.properties中。

假設我想設置一個用戶名= MyUser和一個Password = MyUser應該看起來像username = HEX(MD5(MyUser':'realm':'MyUser))?

+1

默認情況下,WildFly使用8080作爲遠程處理端口。看看https://docs.jboss.org/author/display/WFLY10/EJB+invocations+from+a+remote+client+using+JNDI –

+0

你是否啓用了公共IP https://docs.jelastic.com/公共IPv4的? – Ruslan

+0

@FedericoSierra將端口更改爲8080顯示以下錯誤: 線程「main」中的異常javax.naming.AuthenticationException:無法連接到任何服務器。嘗試使用服務器:[http-remoting:// .jelastic.dogado.eu:8080(身份驗證失敗:所有可用的身份驗證機制失敗: JBOSS-LOCAL-USER:javax.security.sasl.SaslException:無法讀取服務器質詢[引起java.io.FileNotFoundException:\ opt \ repo \ versions \ 10.1 \ standalone \ tmp \ auth \ local7673066471051300535.challenge(Das System kann den angegebenen Pfad nicht finden)] – ken

回答

0

確定,這要歸功於@Federico塞拉利昂意見,我可以解決這個問題

的第一個問題是與遠程端口,8080需要用於代替4447

的第二個問題之一是用戶與應用在服務器端沒有正確設置。

我的服務器是遠程的,我無法運行add-user.sh腳本,所以我選擇直接在application-user.properties文件中添加用戶。 格式必須爲:username = HEX(MD5(username':'ApplicationRealm':'password))