【问题标题】:Configuring/injecting a JMS connection factory and a topic in WildFly在 WildFly 中配置/注入 JMS 连接工厂和主题
【发布时间】:2015-05-02 01:13:45
【问题描述】:

我想在 jBoss WildFly 8.2 上使用 JMS 做一些实验。

默认的 WildFly standalone-full.xml 配置文件有以下片段:

<hornetq-server>

    <connectors>
        ...
        <in-vm-connector name="in-vm" server-id="0"/>
    </connectors>

        ...

    <jms-connection-factories>
        <connection-factory name="InVmConnectionFactory">
            <connectors>
                <connector-ref connector-name="in-vm"/>
            </connectors>
            <entries>
                <entry name="java:/ConnectionFactory"/>
            </entries>
        </connection-factory>
        ...
    </jms-connection-factories>

    <jms-destinations>
         <!-- this destination I have added myself as I need a "topic", but 
                the default configuration has only two preconfigured "queues". -->
        <jms-topic name="MyTestTopic">
            <entry name="java:/jms/topic/MyTestTopic"/>
        </jms-topic>
    </jms-destinations>

</hornetq-server>

我正在尝试通过以下方式将此连接工厂和此主题注入 EJB:

@Stateless
public class JmsPublisher {

    @Resource(mappedName = "java:/ConnectionFactory")
    ConnectionFactory jmsConnectionFactory;

    @Resource(mappedName = "java:/jms/topic/MyTestTopic")
    Topic topic;

但我在部署时收到以下错误消息:

Operation ("deploy") failed ... Services with missing/unavailable dependencies" => ...

...JmsPublisher\".jmsConnectionFactory is missing [jboss.naming.context.java.ConnectionFactory]"
...JmsPublisher\".topic is missing [jboss.naming.context.java.jms.topic.MyTestTopic]"

我做错了什么?

【问题讨论】:

    标签: jakarta-ee jboss jms jndi wildfly


    【解决方案1】:

    您应该使用 mappedName 注入您的目的地/连接工厂,并且您可能需要考虑 JMS 2.0 新 API - JMSContext

    @Resource(mappedName = "java:/topic/someTopic")
    private Topic topic;
    

    假设您有这样的条目

    <jms-topic name="someTopic">
     <entry name="topic/someTopic"/>
    </jms-topic>
    

    对于连接工厂,建议使用默认注入点

    @Resource
    private ConnectionFactory connectionFactory;
    

    但更好的是,只需使用 @Inject JMSContext context 并使用它发送消息。

    【讨论】:

    • 感谢您的回复!但我在注射时确实使用了mappedName。我认为您响应中的前两个代码片段与我使用的代码相同。不是吗?
    • 我的主题定义和你的不一样。
    • 我试过你的代码。 topic 字段仍然存在相同的错误。 connectionFactory 字段的错误消失了。可能那里注入了什么。
    • 当您说代码时,您的意思是描述符更改?请更新您的问题以澄清。
    • 我更新了 XML(standalone-full.xml)和我的 Java 代码。我从您的答案中复制了所有三个 sn-ps 并尝试部署。如果您在我的问题中需要更多信息,请说出您想看的内容。
    【解决方案2】:

    正如here 解释的那样,standalone.xml 支持 Java EE Web-Profile 以及一些扩展,standalone-full.xml 支持 Java EE Full-Profile。

    我的问题是我在standalone-full.xml 中定义了JMS 连接工厂和JMS 主题。 jBoss WildFly 默认使用standalone.xml

    this question 的答案解释了如何配置 WildFly 以使用 standalone-full.xml 而不是 standalone.xml。切换到standalone-full.xml 解决了我的问题。

    【讨论】:

      猜你喜欢
      • 2012-01-14
      • 2020-12-27
      • 2016-02-03
      • 1970-01-01
      • 2020-01-04
      • 2021-05-10
      • 1970-01-01
      • 2017-03-13
      • 2015-02-25
      相关资源
      最近更新 更多