Wildfly jms 配置
Wildfly jms configuration
我在从旧 JBoss 迁移到 Wildfly 14(或其他一些最新版本)时遇到了问题。
目前我坚持使用 JMS 配置。
这是配置:
- 在
<subsystem xmlns="urn:jboss:domain:messaging-activemq:4.0">
中我添加了两个队列定义,代码如下
<jms-queue name="MyQueue" entries="java:/jms/queue/MyQueue"/>
<jms-queue name="OtherQueue" entries="java:/jms/queue/OtherQueue"/>
- 在上面提到的子系统定义中,我添加了以下连接工厂定义
<connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm" />
- 在我的应用程序初始化代码中,我有实例化这些 jms 队列的代码。
在我的 class 中,我有以下字段
private static final String JMS_CONNECTION_FACTORY_JNDI_NAME = "java:/ConnectionFactory";
@Resource(mappedName=JMS_CONNECTION_FACTORY_JNDI_NAME)
ConnectionFactory factory;
在这个class中我有以下方法:
public void openJmsSession() {
try {
connection = factory.createConnection();
Context jndiContext = getInitialContext();
queue =(Queue) jndiContext.lookup(JMS_MAIL_QUEUE_NAME);
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
} catch (NamingException e) {
logger.error("Naming exception during opening JMS session", e);
} catch (JMSException e) {
logger.error("JMS exception during opening JMS session", e);
}
}
第 connection = factory.createConnection();
行抛出 NPE,因为工厂为空。
具有以下配置:
<connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm"/>
我正在使用此代码:
@Resource(mappedName = "java:/ConnectionFactory")
private static ConnectionFactory connectionFactory;
希望对您有所帮助。
如果您只需要访问 JMS 队列,可能有更短的方法(使用 JMS 2.0 的简化 api):
配置:
<jms-queue name="esb.inbound.test" entries="java:/jms/queue/esb.inbound.test"/>
代码:
@Resource(mappedName="java:/jms/queue/esb.inbound.test")
private Queue inboundQueue;
以下方法对我有用:
- 通过 EJB 的解决方案
要通过 EJB 执行此操作,您应该使用 @Stateless
和 @LocalBean
注释标记您的 bean。添加这个之后,你的 bean 将成为一个容器管理的对象,你可以依赖它。此外,在初始上下文创建时,您不应指定任何属性。初始上下文创建应如下所示:
private static Context getInitialContext() throws NamingException
{ return new
InitialContext(); }
- 没有EJB或其他魔法的解决方案
将 wildfly-ejb-client-bom、wildfly-jms-client-bom、wildfly-naming 添加到您的 Maven 依赖项中。在您的客户端代码中使用 JMS 队列和连接工厂的完整 JNDI 名称。例如:
- JMS 队列:
queue/MySuperJMSQueue
之前,之后:java:/jms/queue/MySuperJMSQueue
- JMS 连接工厂:
ConnectionFactory
之前,之后:java:/ConnectionFactory
通过以下行添加新的 JMS 队列来更改您的配置文件(在我的例子中它是独立的-full.xml):
<jms-queue name="MySuperJMSQueue" entries="java:/jms/queue/MySuperJMSQueue"/>
更改已用于初始上下文实例化的参数:
private static Context getInitialContext() throws NamingException {
Properties props = new Properties();
props.put( Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory");
props.put( Context.URL_PKG_PREFIXES, "org.jboss.as.naming.interfaces:org.jboss.ejb.client.naming");
return new InitialContext(props);
}
完成这些操作后,您就可以使用 JMS 了。仅以打开 JMS 会话为例:
Context jndiContext = getInitialContext();
ConnectionFactory factory = (ConnectionFactory) jndiContext.lookup(JMS_CONNECTION_FACTORY_JNDI_NAME);
connection = factory.createConnection();
queue =(Queue) jndiContext.lookup(JMS_QUEUE_NAME);
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
有关详细信息,请查看位于以下路径的文档:<WildFly 14 home folder>\bin\client\README-EJB-JMS.txt
我在从旧 JBoss 迁移到 Wildfly 14(或其他一些最新版本)时遇到了问题。
目前我坚持使用 JMS 配置。
这是配置:
- 在
<subsystem xmlns="urn:jboss:domain:messaging-activemq:4.0">
中我添加了两个队列定义,代码如下
<jms-queue name="MyQueue" entries="java:/jms/queue/MyQueue"/> <jms-queue name="OtherQueue" entries="java:/jms/queue/OtherQueue"/>
- 在上面提到的子系统定义中,我添加了以下连接工厂定义
<connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm" />
- 在我的应用程序初始化代码中,我有实例化这些 jms 队列的代码。
在我的 class 中,我有以下字段
private static final String JMS_CONNECTION_FACTORY_JNDI_NAME = "java:/ConnectionFactory";
@Resource(mappedName=JMS_CONNECTION_FACTORY_JNDI_NAME)
ConnectionFactory factory;
在这个class中我有以下方法:
public void openJmsSession() {
try {
connection = factory.createConnection();
Context jndiContext = getInitialContext();
queue =(Queue) jndiContext.lookup(JMS_MAIL_QUEUE_NAME);
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
} catch (NamingException e) {
logger.error("Naming exception during opening JMS session", e);
} catch (JMSException e) {
logger.error("JMS exception during opening JMS session", e);
}
}
第 connection = factory.createConnection();
行抛出 NPE,因为工厂为空。
具有以下配置:
<connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm"/>
我正在使用此代码:
@Resource(mappedName = "java:/ConnectionFactory")
private static ConnectionFactory connectionFactory;
希望对您有所帮助。
如果您只需要访问 JMS 队列,可能有更短的方法(使用 JMS 2.0 的简化 api):
配置:
<jms-queue name="esb.inbound.test" entries="java:/jms/queue/esb.inbound.test"/>
代码:
@Resource(mappedName="java:/jms/queue/esb.inbound.test")
private Queue inboundQueue;
以下方法对我有用:
- 通过 EJB 的解决方案
要通过 EJB 执行此操作,您应该使用@Stateless
和@LocalBean
注释标记您的 bean。添加这个之后,你的 bean 将成为一个容器管理的对象,你可以依赖它。此外,在初始上下文创建时,您不应指定任何属性。初始上下文创建应如下所示:
private static Context getInitialContext() throws NamingException { return new
InitialContext(); }
- 没有EJB或其他魔法的解决方案
将 wildfly-ejb-client-bom、wildfly-jms-client-bom、wildfly-naming 添加到您的 Maven 依赖项中。在您的客户端代码中使用 JMS 队列和连接工厂的完整 JNDI 名称。例如:
- JMS 队列:
queue/MySuperJMSQueue
之前,之后:java:/jms/queue/MySuperJMSQueue
- JMS 连接工厂:
ConnectionFactory
之前,之后:java:/ConnectionFactory
通过以下行添加新的 JMS 队列来更改您的配置文件(在我的例子中它是独立的-full.xml):
<jms-queue name="MySuperJMSQueue" entries="java:/jms/queue/MySuperJMSQueue"/>
更改已用于初始上下文实例化的参数:
private static Context getInitialContext() throws NamingException {
Properties props = new Properties();
props.put( Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory");
props.put( Context.URL_PKG_PREFIXES, "org.jboss.as.naming.interfaces:org.jboss.ejb.client.naming");
return new InitialContext(props);
}
完成这些操作后,您就可以使用 JMS 了。仅以打开 JMS 会话为例:
Context jndiContext = getInitialContext();
ConnectionFactory factory = (ConnectionFactory) jndiContext.lookup(JMS_CONNECTION_FACTORY_JNDI_NAME);
connection = factory.createConnection();
queue =(Queue) jndiContext.lookup(JMS_QUEUE_NAME);
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
有关详细信息,请查看位于以下路径的文档:<WildFly 14 home folder>\bin\client\README-EJB-JMS.txt