【问题标题】:Wildfly jms configurationWildfly jms 配置
【发布时间】:2019-05-15 20:46:24
【问题描述】:

我在从旧的 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"/>
  • 在上述子系统定义中,我添加了以下连接工厂定义&lt;connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm" /&gt;
  • 在我的应用程序初始化代码中,我有实例化这些 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,因为工厂为空。

【问题讨论】:

  • 您实际上是要定义自定义连接工厂还是只定义目的地?
  • @WillT ,我想让我的代码在新服务器而不是旧服务器上工作。对于 JBoss,使用了 项,但我不知道该为 wildfly 使用什么...
  • @WillT,在之前的配置中,只定义了两个队列,没有自定义连接工厂。有没有默认的连接工厂?如果答案是“是”,- 那怎么用呢?

标签: java jboss jms ejb wildfly


【解决方案1】:

具有以下配置:

<connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm"/>

我正在使用此代码:

@Resource(mappedName = "java:/ConnectionFactory")
private static ConnectionFactory connectionFactory;

希望这会有所帮助。

【讨论】:

  • 您的回答有帮助。我不再收到“javax.naming.NameNotFoundException”,而是在尝试创建 jms 会话时收到“NullPointerException”。
  • 你能用最新的配置更新问题吗?请包括抛出 NPE 的客户端代码以及堆栈跟踪。
【解决方案2】:

如果您只需要访问 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;

【讨论】:

  • 我已删除所有自定义队列和连接工厂,将队列定义添加到我的standalone-full.xml 并将队列添加到我的 JMSClient。结果是:inboundQueue 为空。
  • 我用Eclipse启动Wildfly
  • 您能否检查 WF 是否使用正确的配置文件启动(即在 Eclipse 的启动配置中使用“--server-config=standalone-full.xml”)?
  • 我为此目的使用 eclipse 配置。这是screenshot of my configuration
  • 还请记住,资源注入仅适用于任何 容器管理 对象,例如 servlet、企业 bean 或托管 bean。是你的情况吗?
【解决方案3】:

以下方法对我有用:

  • 通过 EJB 解决方案
    要通过 EJB 执行此操作,您应该使用 @Stateless@LocalBean 注释标记您的 bean。添加后,您的 bean 将成为容器管理的对象,您可以依赖它。此外,在初始上下文创建时,您不应指定任何属性。初始上下文创建应如下所示:
    private static Context getInitialContext() throws NamingException { return newInitialContext(); }
  • 没有 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);

有关更多详细信息,请查看位于以下路径的文档:&lt;WildFly 14 home folder&gt;\bin\client\README-EJB-JMS.txt

【讨论】:

    猜你喜欢
    • 2015-05-05
    • 1970-01-01
    • 2020-03-04
    • 2016-02-24
    • 2016-02-03
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 2015-05-02
    相关资源
    最近更新 更多