Java 8 无法向JBoss EAP 7.2中嵌入的远程ActiveMQ Artemis发送消息

Java 8 无法向JBoss EAP 7.2中嵌入的远程ActiveMQ Artemis发送消息,java-8,jms,activemq-artemis,jboss-eap-7,Java 8,Jms,Activemq Artemis,Jboss Eap 7,我正在尝试向JBoss EAP 7.2中嵌入的远程ActiveMQ Artemis队列发送JMS消息。我在standalone full.xml中定义了以下内容: 远程连接器 池连接工厂 远程绑定 以下是我的客户程序: public void sendObjectMessage(){ Properties initialProperties=新属性(); put(InitialContext.INITIAL_CONTEXT_FACTORY,“org.apache.activemq.artem

我正在尝试向JBoss EAP 7.2中嵌入的远程ActiveMQ Artemis队列发送JMS消息。我在
standalone full.xml
中定义了以下内容:

  • 远程连接器
  • 池连接工厂
  • 远程绑定
  • 
    
    以下是我的客户程序:

    public void sendObjectMessage(){
    Properties initialProperties=新属性();
    put(InitialContext.INITIAL_CONTEXT_FACTORY,“org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory”);
    initialProperties.put(InitialContext.PROVIDER\u URL,“tcp://127.0.0.1:61616");
    试一试{
    上下文=新的InitialContext(initialProperties);
    factory=(QueueConnectionFactory)context.lookup(“java:/jms/remoteIM”);
    destination=(Queue)context.lookup(“java:global/remoteContext/ImportantMessages”);
    connection=factory.createConnection();
    会话=connection.createSession(false,session.AUTO_-ACKNOWLEDGE);
    producer=session.createProducer(目的地);
    EventMessage EventMessage=新的EventMessage(“1”,“来自FirstClient的消息”);
    ObjectMessage ObjectMessage=session.createObjectMessage();
    setObject(eventMessage);
    connection.start();
    producer.send(objectMessage);
    System.out.println(this.getClass().getName()+”发送了一条消息:“+eventMessage”);
    }捕获(NamingE例外){
    e、 printStackTrace();
    }捕获(JME){
    e、 printStackTrace();
    }最后{
    if(上下文!=null){
    试一试{
    context.close();
    }捕获(NamingException-ex){
    例如printStackTrace();
    }
    }
    if(连接!=null){
    试一试{
    connection.close();
    }捕获(JMEX){
    例如printStackTrace();
    }
    }
    }
    }
    
    我得到以下例外情况:

    javax.naming.NamingException: scheme java not recognized
        at org.apache.activemq.artemis.jndi.ReadOnlyContext.lookup(ReadOnlyContext.java:222)
        at javax.naming.InitialContext.lookup(Unknown Source)
        at com.example.demo.sender.FirstClient.sendObjectMessage(FirstClient.java:41)
        at com.example.demo.controller.MessagingController.sendMessage(MessagingController.java:19)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:888)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1591)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Unknown Source)
    

    有人能告诉我我做错了什么吗?

    为了向JBoss EAP中嵌入的远程ActiveMQ Artemis队列发送JMS消息,您可以使用默认的
    standalone full.xml
    。您不需要设置远程连接器、池连接工厂或远程绑定。您只需使用JBoss EAP JNDI上下文从客户端查找
    jms/RemoteConnectionFactory
    。需要明确的是,当ActiveMQ Artemis嵌入JBoss EAP中时,远程客户端使用JBoss EAP JNDI上下文而不是ActiveMQ Artemis JNDI上下文,因为EAP本身负责所有JNDI操作

    您的客户端正在使用ActiveMQ Artemis JNDI上下文:

    initialProperties.put(InitialContext.INITIAL_CONTEXT_工厂,“org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory”);
    initialProperties.put(InitialContext.PROVIDER\u URL,“tcp://127.0.0.1:61616");
    
    这是不正确的。您应该改为使用此选项:

    initialProperties.put(InitialContext.INITIAL_CONTEXT_FACTORY,“org.wildfly.naming.client.WildFlyInitialContextFactory”);
    put(InitialContext.PROVIDER\u URL,“http-remoting://127.0.0.1:8080");
    
    注意:您也可以在此处使用
    org.jboss.naming.remote.client.InitialContextFactory
    ,因为该类也随jboss EAP 7.2一起提供。但是,这个类实际上是为了向后兼容遗留客户端而包含的

    然后,您的客户端正在尝试查找您在
    standalone full.xml
    中配置的
    池连接工厂:

    factory=(QueueConnectionFactory)context.lookup(“java:/jms/remoteIM”);
    
    这也是不正确的。
    池连接工厂
    只能由运行在与JBoss EAP相同JVM中的客户端使用(例如,需要发送消息的MDB)。您不能简单地从远程客户端查找它并期望得到池。这不是它的工作原理。您应该这样做:

    factory=(QueueConnectionFactory)context.lookup(“jms/RemoteConnectionFactory”);
    
    这将使用名为
    RemoteConnectionFactory
    standalone full.xml
    中的默认
    连接工厂

    然后,您正在查找一个消息子系统中甚至没有定义的队列(即
    java:global/remoteContext/ImportantMessages
    )。由于某种原因,您显然在
    外部上下文中配置了它。这对于EAP是错误的。您应该在
    standalone full.xml
    中定义:

    
    
    然后在您的客户机中使用:

    destination=(Queue)context.lookup(“ImportantMessages”);
    
    最后,这就是
    standalone full.xml
    中的消息传递子系统的外观:

    
    你可能会发现这对参考很有用

    如果您使用Maven构建客户机应用程序,则应使用以下依赖项:

    
    org.jboss.eap
    
    .

    当我将InitialContextFactory命名为org.wildfly.naming.client.WildFlyInitialContextFactory时,它给了我一个ClassNotFoundException。我将InitialContextFactory更改为org.jboss.naming.remote.client.InitialContextFactory,将jboss远程命名和xnio jar文件添加到类路径。现在它抛出javax.naming.NamingException:无法连接到任何服务器。已尝试的服务器:[http-remoting://127.0.0.1:8080]现在我可以查找ConnectionFactory和Queue,但是在发送给我时