[英]JBoss AS 7 Bean Lookup EJB
我知道這里也有一些類似的問題,但是我仍然找不到解決方案。 我有兩台JBoss AS 7.0服務器在同一台機器上運行,分別是A和B。
A是服務器,並提供以下服務:
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:
開頭的查找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...
開頭的查找ejb...
java.lang.IllegalStateException: EJBCLIENT000025: No EJB receiver available for handling [appName:Foo-Batch, moduleName:Foo-Services, distinctName:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@4c42ff8
注意,我可以使用SOAP-UI和生成的WSDL作為Web服務訪問此bean,因此該服務已啟動。 但是,我的意圖是使用EJB進行訪問。
解決了! 我退出了對遠程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( ....
}
一切看起來都很完美
此處有更多信息:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.