2013-11-06 6 views
1

Я знаю, что здесь есть некоторые подобные вопросы, но я до сих пор не могу найти решение. У меня есть два JBoss AS 7.0 серверов, работающих в одной и той же машине, а именно A и B.JBoss AS 7 Bean Lookup EJB

, является сервер и предоставляет эту услугу:

15:49:02,998 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-4) JNDI bindings for session bean named QuartzManagerBean in deployment unit subdeployment "Foo-Services.jar" of deployment "Foo-Batch.ear" are as follows: 

java:global/Foo-Batch/Foo-Services/QuartzManagerBean!foo.services.interfaces.IQuartzManagerLocal 
java:app/Foo-Services/QuartzManagerBean!foo.services.interfaces.IQuartzManagerLocal 
java:module/QuartzManagerBean!foo.services.interfaces.IQuartzManagerLocal 
java:global/Foo-Batch/Foo-Services/QuartzManagerBean!foo.services.interfaces.IQuartzManagerRemote 
java:app/Foo-Services/QuartzManagerBean!foo.services.interfaces.IQuartzManagerRemote 
java:module/QuartzManagerBean!foo.services.interfaces.IQuartzManagerRemote 
java:jboss/exported/Foo-Batch/Foo-Services/QuartzManagerBean!foo.services.interfaces.IQuartzManagerRemote 

QuartzManagerBean

package foo.services.bean; 


@Startup 
@Singleton 

@Remote(IQuartzManagerRemote.class) 


@TransactionManagement(value=TransactionManagementType.BEAN) 
@TransactionAttribute(value=TransactionAttributeType.NOT_SUPPORTED) 


@WebService(name = "BatchQuartzManagerBean", targetNamespace = "urn:foo", serviceName = "BatchQuartzManagerBean") 
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED, use = SOAPBinding.Use.LITERAL) 

public class QuartzManagerBean implements IQuartzManagerLocal, IQuartzManagerRemote{ 

... 

    public synchronized ReturnType fooMethod(
       String serverName, 
       .... 

       ) 
       { 

       ... 

       } 
       ... 

} 

, наконец, интерфейс IQuartzManagerRemote

@Remote 
@WebService 
public interface IQuartzManagerRemote { 


    @WebMethod(operationName = "fooMethod") 
    public ReturnType fooMethod(
      @WebParam(name="serverName") String serverName, 
      .... 
      ); 


} 

На сервере B, мне нужно сделать удаленный доступ к этому EJB. Я попробовал несколько подходов, как этот

 env.put("endpoint.name","client-endpoint"); 
     env.put("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED", "false"); 
     env.put("remote.connections", "default"); 
     env.put("remote.connection.default.host","127.0.0.1"); 
     env.put("remote.connection.default.port","4447"); 
     env.put("remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS", "false"); 
     env.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); 
     env.put("jboss.naming.client.ejb.context", true); 
     context = new InitialContext(env); 

или этого

Properties jndiProps = new Properties(); 
    jndiProps.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory"); 
    jndiProps.put(Context.PROVIDER_URL,"rhttp://localhost:8080/Foo-Services/BatchQuartzManagerBean/BatchQuartzManagerBean:4447"); 
    // This is an important property to set if you want to do EJB invocations via the remote-naming project 
    jndiProps.put("jboss.naming.client.ejb.context", true); 
    // create a context passing these properties 
    Context context = new InitialContext(jndiProps); 

или этого

Properties jndiProps = new Properties(); 
     jndiProps.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory"); 
     jndiProps.put(Context.PROVIDER_URL,"remote://localhost:4447"); 
     jndiProps.put("jboss.naming.client.ejb.context", true); 
     // create a context passing these properties 
     InitialContext ctx = new InitialContext(jndiProps); 

или этого

Properties p = new Properties(); 
     p.put("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED", "false"); 
     p.put("remote.connections", "one"); 
     p.put("remote.connection.one.port", "4447"); 
     p.put("remote.connection.one.host", "localhost"); 
     p.put("jboss.naming.client.ejb.context", true); 

     EJBClientConfiguration cc = new PropertiesBasedEJBClientConfiguration(p); 
     ContextSelector<EJBClientContext> selector = new ConfigBasedEJBClientContextSelector(cc); 
     EJBClientContext.setSelector(selector); 

и т.д ....

В конце концов, мне нужно выполнить поиск, и, опять же, я пробовал разные способы.

QuartzManagerRemote quartzWSClient = (IQuartzManagerRemote) context.lookup("ejb:" + "Foo-Batch" + "/" + "Foo-Services" + "/" + "/" +"QuartzManagerBean" + "!" +IQuartzManagerRemote.class.getName()); 

или с java: или java:exported/ вероятно, все комбинации ..

В результате почти всегда одинакова. Если я использую поиск начал с java: я получаю

ERROR [stderr] (http-/127.0.0.1:8180-6) javax.naming.NameNotFoundException: Foo-Batch/Foo-Services//QuartzManagerBean!foo.services.interfaces.IQuartzManagerRemote -- service jboss.naming.context.java.jboss.exported.Foo-Batch.Foo-Services."QuartzManagerBean!foo.services.interfaces.IQuartzManagerRemote" 

с другой стороны, если я использую поиск начал с ejb...

java.lang.IllegalStateException: EJBCLIENT000025: No EJB receiver available for handling [appName:Foo-Batch, moduleName:Foo-Services, distinctName:] combination for invocation context [email protected] 

Примечание я могу получить доступ к этой боб с помощью SOAP-интерфейса и сгенерированный WSDL в качестве webservice, поэтому услуга завершена. Тем не менее, я намерен получить доступ к EJB.

+0

, если он работает с SoapUI, то вы иметь правильную конечную точку, определенную там, использовать это. – wxyz

+0

@wxyz, доступ к SOAP-UI через webservice. Мне нужно получить доступ к EJB. В моем случае этот компонент является 2in1. –

ответ

0

Решенный! Я ухожу, чтобы получить доступ к удаленному EJB и получить доступ к WS без создания заглушек и т. Д. Таким образом, мне нужно создать метод, в котором я получаю порт для общения.

private static IQuartzManagerRemote getPort(String endpointURI) throws MalformedURLException { 
      QName serviceName = new QName("urn:foo", "FooQuartzManagerBean"); 
      URL wsdlURL = new URL(endpointURI); 

      Service service = Service.create(wsdlURL, serviceName); 
      return service.getPort(IQuartzManagerRemote.class); 
     } 

и в моем методе просто сделать простой вызов

.... myMethod() { 

String endpointURI ="http://127.0.0.1:8080/Foo-Services/FooQuartzManagerBean/FooQuartzManagerBean?WSDL"; 

//call webmethod instatianteJob 
getPort(endpointURI).instantiateJob(.... 

} 

Все выглядит идеальный

Больше информации здесь:

Reference - JBoss Web Services Part I

Смежные вопросы