繁体   English   中英

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队列的代码。

在我的课堂上,我有以下领域

private static final String JMS_CONNECTION_FACTORY_JNDI_NAME = "java:/ConnectionFactory";
@Resource(mappedName=JMS_CONNECTION_FACTORY_JNDI_NAME)
ConnectionFactory factory;

在这个课程中,我有以下方法:

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,因为factory为null。

具有以下配置:

<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(); } InitialContext(); }
  • 没有EJB或其他魔力的解决方案

将wildfly-ejb-client-bom,wildfly-jms-client-bom,wildfly-naming添加到您的Maven依赖项中。 在您的客户端代码中,使用JMS队列和连接工厂的完整JNDI名称。 例如:

  1. JMS队列:在queue/MySuperJMSQueue之前,在java:/jms/queue/MySuperJMSQueue
  2. JMS连接工厂: ConnectionFactory之前, java:/ConnectionFactory

通过以下行添加新的JMS队列来更改配置文件(在我的情况下为standalone-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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM