Jboss wildfly:如何从http servlet调用EJB

Jboss wildfly:如何从http servlet调用EJB,jboss,ejb,wildfly,war,ear,Jboss,Ejb,Wildfly,War,Ear,在wildfly(版本23)中,我尝试调用EJB3.0bean时出错,该bean在tserver.jar中用@Stateless注释声明: 起初,即使是查找也会失败: javax.ejb.NoSuchEJBException:ejbclient00079:无法发现“TServerXmlRpc/tserver/MFProLoginBean”的ejb无状态ejblocator请求的目标,视图为接口it.company.tserver.beans.mfpro.login.MFProLogin,关联为N

在wildfly(版本23)中,我尝试调用EJB3.0bean时出错,该bean在tserver.jar中用@Stateless注释声明:

起初,即使是查找也会失败: javax.ejb.NoSuchEJBException:ejbclient00079:无法发现“TServerXmlRpc/tserver/MFProLoginBean”的ejb无状态ejblocator请求的目标,视图为接口it.company.tserver.beans.mfpro.login.MFProLogin,关联为None

现在我得到: org.jboss.ejb.client.RequestSendFailedException:EJBCLIENT000409:没有更多可用的目标

我可以调试被正确调用的http servlet,我把它作为.war和.ear,我可以从一个独立的java程序中查找bean,要调用它,我需要服务器端代码,我还没有尝试过。 在我试图从JBoss4.2.3迁移的应用程序中,我可以从其他jboss测试调用类似的bean

可能是什么问题,有什么建议吗

这是从远程java客户端进行的客户端调用:

package client;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Properties;
import ejb3.CallerRemote;
public class Client {
     public static void main(String ar[]) throws Exception {
          Context context=null;
          try {
                Properties props = new Properties();
                props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
                //props.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory");// test
                //props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
                
                context = new InitialContext(props);    
                System.out.println("\n\tGot initial Context: "+context);        
          } catch (Exception e) {
                e.printStackTrace();
          }

          Object test=context.lookup("ejb:TServerXmlRpc/MFProLoginBean!it.company.tserver.beans.mfpro.login.MFProLogin");
          //   When the invocation starts you try stopping the WildFly and then restart it back to find out if client reconnection works or not.
          CallerRemote remote=(CallerRemote)context.lookup("ejb:TestEAR/remoteEjbOne/CallerBean!ejb3.CallerRemote");
          for (int i = 0; i <= 300; i++) {  
             try {
                   System.out.println("\n\t remote.testMethod(\"MiddlewareMagic!!!\") = "+remote.testMethod("MiddlewareMagic!!!"));
                   Thread.sleep(500);
              } catch(Exception e) {                    
                    System.out.println("\n\tEXCEPTION: " + e.getMessage());
                    e.printStackTrace();
                    try{ Thread.sleep(500); } catch(InterruptedException ee) {  ee.printStackTrace(); } 
              }  
          }  
     }
  }
我也试着把战争放在耳朵里:

META-INF\MANIFEST.MF
META-INF\application.xml
META-INF\jboss-ejb-client.properties

TServerXmlRpc.war
tserver.jar

lib\LogManager.jar
lib\compass-core.jar
lib\xmlrpc-common-3.1.3.jar
lib\xmlrpc-server-3.1.3.jar
此外,下拖中的wildfly 404错误可能是由于什么原因造成的:

2021-04-21 06:33:53910调试[io.undertow.request](默认I/O-1)匹配默认处理程序路径/unified invoker/JNDIFORY/ejb/v1/invoke/-/JBossTest server/-/EJB3TestBean/-/it.company.tserver.beans.ejbtest.EJB3Test/test/int/java.util.Date 2021-04-21 06:33:53916调试HttpServerExchange{POST/unified invoker/JNDIFactory/ejb/v1/invoke/-/JBossTest server/-/EJB3TestBean/-/it.onetech.tserver.beans.ejbtest.EJB3Test/test/int/java.util.Date}的响应代码设置为[404]

是否可以禁用java.lang.SecurityException的EJB身份验证:WFHTTP000008:身份验证失败

更新: 它似乎适用于这种情况:

put(Context.INITIAL\u Context\u FACTORY,org.jboss.naming.remote.client.InitialContextFactory)

props.put(Context.PROVIDER\u URL,“远程+http://172.21.93.102:8080”;

使用ejb:path和此建议似乎都有效:

请注意,http远程处理客户端假定远程查找中的JNDI名称是相对于java:jboss/exported命名空间的,则绝对JNDI名称的查找将失败

i、 e.在server.log中查找java:jboss/exported之后的路径

我怀疑在战争中调用EJB有什么奇怪之处

“导出”仅适用于声明为“@remote”的bean? 如何调用声明为“@local”的bean

使用props.put(Context.PROVIDER\u URL,“远程+http://localhost:8080”;

在jboss服务器端

更新:

我有一个模式,其中bean(在遗留应用程序中)同时具有本地和远程接口,如下所述:

因此,我找到了本地bean的示例:

我看到他们没有使用@Local注释,而是使用@Remote(?),所以我将本地接口转换为远程接口,它显示在ejb:methodLocal名称空间中,如果有人有任何线索的话,它似乎可以从jboss和jdni中调用

2021-04-24 23:31:38,016 INFO  [org.jboss.as.ejb3.deployment] (MSC service thread 1-2) WFLYEJB0473: JNDI bindings for session bean named 'DataUpdateCheckerBean' in deployment unit 'deployment "TServerXmlRpc.war"' are as follows:

    java:global/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal
    java:app/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal
    java:module/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal
    java:jboss/exported/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal
    **ejb:/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal**
    java:global/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker
    java:app/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker
    java:module/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker
    java:jboss/exported/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker
    ejb:/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker

我更新了问题的主体,这似乎是一个笑话,但老实说,我正在尝试将现有的jboss 4.2.3 war应用程序迁移到wildfly,以防任何可能的cluesI引用了一个示例,该示例演示了如何使用@EJB proxy查找和调用本地bean,而不是jndi上下文查找和调用
2021-04-24 23:31:38,016 INFO  [org.jboss.as.ejb3.deployment] (MSC service thread 1-2) WFLYEJB0473: JNDI bindings for session bean named 'DataUpdateCheckerBean' in deployment unit 'deployment "TServerXmlRpc.war"' are as follows:

    java:global/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal
    java:app/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal
    java:module/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal
    java:jboss/exported/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal
    **ejb:/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal**
    java:global/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker
    java:app/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker
    java:module/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker
    java:jboss/exported/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker
    ejb:/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker