在 JBoss EAP 7 上部署 JMS 应用程序时出错
Error deploying JMS appplication on JBoss EAP 7
我在部署应用程序时收到以下错误:
/opt/eap/bin # cat ../standalone/deployments/SitioWebFinal.war.failed { "WFLYCTL0412: Required services that are not installed:" => ["jboss.naming.context.java.jboss.java:env.jms.fabrica"], "WFLYCTL0180: Services with missing/unavailable dependencies" => ["jboss.naming.context.java.module.SitioWebFinal.SitioWebFinal.env.jms.fabrica is missing [jboss.naming.context.java.jboss.java:env.jms.fabrica]"]
我有以下代码将消息发送到 amq 服务器:
package amqlib;
import javax.naming.*;
import javax.jms.*;
public class Producctor {
public void enviaMensajeCola(String mundo) throws JMSException {
try {
InitialContext initCtx = new InitialContext();
QueueConnectionFactory f = (QueueConnectionFactory) initCtx.lookup("java:jboss/exported/jms/fabrica");
QueueConnection con = f.createQueueConnection();
con.start();
QueueSession ses = con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
InitialContext initCtx2 = new InitialContext();
Queue t = (Queue) initCtx2.lookup("/queue");
QueueSender sender = ses.createSender(t);
TextMessage msg = ses.createTextMessage();
InputStreamReader(System.in));
String s = mundo;
msg.setText(s);
// 7) send message
sender.send(msg);
System.out.println("Message successfully sent.");
// 8) connection close
con.close();
}
catch (Exception e) {
System.out.println("Este es el error " + e);
}
}
public static void main(String[] args) throws JMSException {
Producctor p = new Producctor();
p.enviaMensajeCola("Hola Mundo");
}
}
这是 standalone-full-ha.xml
配置文件中的连接工厂。
<connection-factory name="fabrica" entries="java:jboss/exported/jms/fabrica" connectors="in-vm"/>
这是 .war 里面的 web.xml 这和我在 tomcat 9 中使用的 xml 相同。我不知道它是否可以是 seme 文件。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>SitioWebFinal</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<distributable/>
<resource-ref>
<description>ConnectionFactory</description>
<res-ref-name>jms/fabrica</res-ref-name>
<res-type>org.apache.activemq.ActiveMQConnectionFactory</res-type>
<res-auth>Container</res-auth>
<lookup-name>java:env/jms/fabrica</lookup-name>
</resource-ref>
</web-app>
我也有context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context name="/SitioWebFinal" antiJARLocking="true">
<Resource
name="jms/fabrica"
auth="Container"
type="org.apache.activemq.ActiveMQConnectionFactory"
description="JMS Connection Factory"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
brokerURL="tcp://amq-cicd-int-amq-tcp.svc.cluster.local:61616"
brokerName="ActiveMQBroker"
useEmbeddedBroker="false"/>
<Resource name="jms/topic"
auth="Container"
type="org.apache.activemq.command.ActiveMQTopic"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
physicalName="APP.JMS.TOPIC"/>
<Resource name="jms/queue"
auth="Container"
type="org.apache.activemq.command.ActiveMQQueue"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
physicalName="APP.JMS.QUEUE"/>
</Context>
此致
您的 connection-factory
配置没有多大意义。这是您正在使用的:
<connection-factory name="fabrica" entries="java:jboss/exported/jms/fabrica" connectors="in-vm"/>
您使用的是 exported
JNDI 命名空间,它将此连接工厂公开给 JVM 外部的客户端 运行(即远程客户端),但您使用的是 in-vm
connectors
这意味着 JVM 外部的客户端 运行 实际上无法使用连接工厂,因为 in-vm
连接器对它们不起作用。
尝试在应用程序服务器中为您的客户端 运行 简单地修改现有的 InVmConnectionFactory
,例如:
<connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory java:/jms/fabrica" connectors="in-vm"/>
然后尝试为您的远程客户端修改现有的 RemoteConnectionFactory
,例如:
<connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory java:jboss/exported/jms/fabrica" connectors="http-connector"/>
完成这些更改后,重新部署您的应用程序。
我在部署应用程序时收到以下错误:
/opt/eap/bin # cat ../standalone/deployments/SitioWebFinal.war.failed { "WFLYCTL0412: Required services that are not installed:" => ["jboss.naming.context.java.jboss.java:env.jms.fabrica"], "WFLYCTL0180: Services with missing/unavailable dependencies" => ["jboss.naming.context.java.module.SitioWebFinal.SitioWebFinal.env.jms.fabrica is missing [jboss.naming.context.java.jboss.java:env.jms.fabrica]"]
我有以下代码将消息发送到 amq 服务器:
package amqlib;
import javax.naming.*;
import javax.jms.*;
public class Producctor {
public void enviaMensajeCola(String mundo) throws JMSException {
try {
InitialContext initCtx = new InitialContext();
QueueConnectionFactory f = (QueueConnectionFactory) initCtx.lookup("java:jboss/exported/jms/fabrica");
QueueConnection con = f.createQueueConnection();
con.start();
QueueSession ses = con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
InitialContext initCtx2 = new InitialContext();
Queue t = (Queue) initCtx2.lookup("/queue");
QueueSender sender = ses.createSender(t);
TextMessage msg = ses.createTextMessage();
InputStreamReader(System.in));
String s = mundo;
msg.setText(s);
// 7) send message
sender.send(msg);
System.out.println("Message successfully sent.");
// 8) connection close
con.close();
}
catch (Exception e) {
System.out.println("Este es el error " + e);
}
}
public static void main(String[] args) throws JMSException {
Producctor p = new Producctor();
p.enviaMensajeCola("Hola Mundo");
}
}
这是 standalone-full-ha.xml
配置文件中的连接工厂。
<connection-factory name="fabrica" entries="java:jboss/exported/jms/fabrica" connectors="in-vm"/>
这是 .war 里面的 web.xml 这和我在 tomcat 9 中使用的 xml 相同。我不知道它是否可以是 seme 文件。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>SitioWebFinal</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<distributable/>
<resource-ref>
<description>ConnectionFactory</description>
<res-ref-name>jms/fabrica</res-ref-name>
<res-type>org.apache.activemq.ActiveMQConnectionFactory</res-type>
<res-auth>Container</res-auth>
<lookup-name>java:env/jms/fabrica</lookup-name>
</resource-ref>
</web-app>
我也有context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context name="/SitioWebFinal" antiJARLocking="true">
<Resource
name="jms/fabrica"
auth="Container"
type="org.apache.activemq.ActiveMQConnectionFactory"
description="JMS Connection Factory"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
brokerURL="tcp://amq-cicd-int-amq-tcp.svc.cluster.local:61616"
brokerName="ActiveMQBroker"
useEmbeddedBroker="false"/>
<Resource name="jms/topic"
auth="Container"
type="org.apache.activemq.command.ActiveMQTopic"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
physicalName="APP.JMS.TOPIC"/>
<Resource name="jms/queue"
auth="Container"
type="org.apache.activemq.command.ActiveMQQueue"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
physicalName="APP.JMS.QUEUE"/>
</Context>
此致
您的 connection-factory
配置没有多大意义。这是您正在使用的:
<connection-factory name="fabrica" entries="java:jboss/exported/jms/fabrica" connectors="in-vm"/>
您使用的是 exported
JNDI 命名空间,它将此连接工厂公开给 JVM 外部的客户端 运行(即远程客户端),但您使用的是 in-vm
connectors
这意味着 JVM 外部的客户端 运行 实际上无法使用连接工厂,因为 in-vm
连接器对它们不起作用。
尝试在应用程序服务器中为您的客户端 运行 简单地修改现有的 InVmConnectionFactory
,例如:
<connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory java:/jms/fabrica" connectors="in-vm"/>
然后尝试为您的远程客户端修改现有的 RemoteConnectionFactory
,例如:
<connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory java:jboss/exported/jms/fabrica" connectors="http-connector"/>
完成这些更改后,重新部署您的应用程序。