Взял пример
https://docs.jboss.org/author/display/AS71/EJB+invocations+from+a+remote+client+using+JNDI
Редуцировал его до такого:
@Remote
public interface TestRemote {
int add(int a, int b);
}
@Stateless
public class TestBL implements TestRemote {
@Override
public int add(int a, int b) {
return a+b;
}
}
Собрал простейший jar и задеплоил. В логах всё хорошо
[code=nocolor]
17:08:28,628 INFO [org.jboss.as.server.deployment] (MSC service thread 1-1) JBAS015876: Starting deployment of "JBoss7Test-0.SHAPSHOT.jar"
17:08:28,659 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-4) JNDI bindings for session bean named TestBL in deployment unit deployment "JBoss7Test-0.SHAPSHOT.jar" are as follows:
java:global/JBoss7Test-0.SHAPSHOT/TestBL!ru.start2com.test.jboss7.beans.TestRemote
java:app/JBoss7Test-0.SHAPSHOT/TestBL!ru.start2com.test.jboss7.beans.TestRemote
java:module/TestBL!ru.start2com.test.jboss7.beans.TestRemote
java:jboss/exported/JBoss7Test-0.SHAPSHOT/TestBL!ru.start2com.test.jboss7.beans.TestRemote
java:global/JBoss7Test-0.SHAPSHOT/TestBL
java:app/JBoss7Test-0.SHAPSHOT/TestBL
java:module/TestBL
17:08:28,706 INFO [org.jboss.as.server] (DeploymentScanner-threads — 2) JBAS018559: Deployed "JBoss7Test-0.SHAPSHOT.jar"
[/code]
Создал файл jboss-ejb-client.properties
[code=nocolor]
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=localhost
remote.connection.default.port = 4447
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
endpoint.name=client-endpoint
[/code=nocolor]
и клиентский код
private static void invokeStatelessBean() throws NamingException {
TestRemote statelessRemoteCalculator = lookupRemoteStatelessCalculator();
int sum = statelessRemoteCalculator.add(3, 4);
System.out.println("sum = " + sum);
}
private static TestRemote lookupRemoteStatelessCalculator() throws NamingException {
Security.addProvider(new JBossSaslProvider());
final Hashtable<String, String> p = new Hashtable<String, String>();
p.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
p.put(Context.SECURITY_PRINCIPAL, "alxt");
p.put(Context.SECURITY_CREDENTIALS, "123");
final Context context = new InitialContext(p);
return (TestRemote) context.lookup("ejb:app/JBoss7Test-0.SHAPSHOT/TestBL!ru.start2com.test.jboss7.beans.TestRemote");
}
При запуске на строке "int sum = statelessRemoteCalculator.add(3, 4);" ошибка
[code=nocolor]
Exception in thread "main" java.lang.IllegalStateException: No EJB receiver available for handling [appName:app,modulename:JBoss7Test-0.SHAPSHOT,distinctname:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@7ff5b6
at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:584)
at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:119)
at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:181)
at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:136)
at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:121)
at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:104)
at $Proxy0.add(Unknown Source)
at ru.start2com.test.jboss7.client.TestRemoteClient.invokeStatelessBean(TestRemoteClient.java:23)
[/code]
При этом на сервере:
17:09:29,677 ERROR [org.jboss.remoting.remote.connection] (Remoting "alxt" read-1) JBREM000200: Remote connection failed: java.io.IOException
Пользователя добавил, пробовал без указания оного.
jboss-ejb-client.properties точно подхватывается (если поменять, к примеру, в нём порт- то не соединится).
Ткните, пожалуйста, где я ошибся. Или дайте рабочий пример (на сайте жбосса не нашёл- у всех pom.xml странный- у меня не компилируется).
PS: jboss 7.1.1
java — build 1.7.2 на сервере и 1.6.28 в клиенте (из эклипса).
Нашёл! Вместо
return (TestRemote) context.lookup("ejb:app/JBoss7Test-0.SHAPSHOT/TestBL!ru.start2com.test.jboss7.beans.TestRemote");
надо
return (TestRemote) context.lookup("ejb:/JBoss7Test-0.SHAPSHOT//TestBL!ru.start2com.test.jboss7.beans.TestRemote");
Спасибо всем, кто хотя бы посмотрел
Здравствуйте, alxt, Вы писали:
A>Нашёл! Вместо
A>A>return (TestRemote) context.lookup("ejb:app/JBoss7Test-0.SHAPSHOT/TestBL!ru.start2com.test.jboss7.beans.TestRemote");
A>
A>надо
A>A>return (TestRemote) context.lookup("ejb:/JBoss7Test-0.SHAPSHOT//TestBL!ru.start2com.test.jboss7.beans.TestRemote");
A>
A>Спасибо всем, кто хотя бы посмотрел
А зачем через context.lookup ? Почему не использовать аннотацию @EJB