Java 8 无法向JBoss EAP 7.2中嵌入的远程ActiveMQ Artemis发送消息
我正在尝试向JBoss EAP 7.2中嵌入的远程ActiveMQ Artemis队列发送JMS消息。我在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
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,但是在发送给我时