【问题标题】:Glassfish 3.1 ActiveMQ and genericra consuming messagesGlassfish 3.1 ActiveMQ 和泛型消费消息
【发布时间】:2011-12-14 04:28:34
【问题描述】:

使用的技术。

  • ActiveMQ 5.5.1
  • Glassfish 3.1
  • 泛型 2.1

我在哪里;

  • 我已安装并运行 ActiveMQ
  • genericra 在 Glassfish 中配置并运行。我已经配置了连接器资源 (amqRes)、连接器连接池 (amqPool) 和管理对象资源 (amqQueue)。部署了 genericra 并配置了资源适配器配置。
  • 我可以从 Glassfish 中运行的应用程序向 activeMQ 队列发布消息。当我发帖时,我可以在 activeMQ 管理控制台的队列中看到一个新条目。

我们正在使用其他 JMS 队列(在 glassfish 中),它们运行良好。

我遇到的问题是从 activeMQ 队列中获取消息。我编写了一个实现 javax.jms.MessageListener 的测试 @MessageDriven bean。它有一个简单的方法(onMessage),只输出消息。我不确定如何注册 MDB 以便它从 activeMQ 队列中获取消息。我已经看到了很多将条目放入 ejb-jar.xml、glassfish-ejb-jar.xml 或 sun-ejb-jar.xml 的示例——其中没有一个对我有用。当我查看 activeMQ 控制台时,我看不到我创建的队列的任何消费者。

我已经阅读了许多博客,但似乎缺少最后一块拼图。

import javax.ejb.MessageDriven;
import javax.jms.Message;

@MessageDriven(mappedName = "amqQueue")
public class ActiveMQTestListener implements javax.jms.MessageListener {
    public void onMessage(Message message) {
        System.out.println(message.toString());
    }
}

【问题讨论】:

  • 我已将 MDB 添加到我的问题中

标签: java activemq glassfish-3 jca generic-jms-ra


【解决方案1】:

好的,所以在玩了很多之后,我让它工作了。事实证明,您无需创建连接器资源、连接池或管理对象资源即可接收来自活动 mq 的消息。

总的来说,我在 glassfish http://java.net/downloads/genericjmsra/v2.1a/binaries/ 中部署了连接器 genericra.rar(我将名称更改为 genericRA)。我使用来自http://activemq.apache.org/sjsas-with-genericjmsra.html 的设置配置了资源适配器配置(复制如下 - 稍作修改以适合示例)。我在 glassfish 中手动输入了详细信息。

asadmin create-resource-adapter-config
  --property
  SupportsXA=true
  :RMPolicy=OnePerPhysicalConnection
  :ProviderIntegrationMode=javabean
  :ConnectionFactoryClassName=org.apache.activemq.ActiveMQConnectionFactory
  :QueueConnectionFactoryClassName=org.apache.activemq.ActiveMQConnectionFactory
  :TopicConnectionFactoryClassName=org.apache.activemq.ActiveMQConnectionFactory
  :XAConnectionFactoryClassName=org.apache.activemq.ActiveMQXAConnectionFactory
  :XAQueueConnectionFactoryClassName=org.apache.activemq.ActiveMQXAConnectionFactory
  :XATopicConnectionFactoryClassName=org.apache.activemq.ActiveMQXAConnectionFactory
  :UnifiedDestinationClassName=org.apache.activemq.command.ActiveMQDestination
  :QueueClassName=org.apache.activemq.command.ActiveMQQueue
  :TopicClassName=org.apache.activemq.command.ActiveMQTopic
  :ConnectionFactoryProperties=brokerURL\\=tcp\\://127.0.0.1\\:61616
  :LogLevel=FINE
  genericRA

如果您想从 glassfish 发送啤酒,我们发现管理对象资源没有出现在 jndi 列表 (./asadmin list-jndi-entries) 中。我们发现管理对象资源被禁用。我们必须编辑 domain.xml 并设置 enabled = true。

我的测试消息驱动 bean;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;

@MessageDriven(activationConfig =  {
    @ActivationConfigProperty(propertyName = "destinationType",propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "destinationProperties",propertyValue = "PhysicalName=amqQueue")
})
public class ActiveMQTestListener implements MessageListener {
    public void onMessage(Message message) {
        System.out.println(message.toString());
    }
}

我的 glassfish-ejb-jar.xml;

<glassfish-ejb-jar>
    <enterprise-beans>
        <ejb>
            <ejb-name>ActiveMQTestListener</ejb-name>
            <mdb-resource-adapter>
                <resource-adapter-mid>genericRA</resource-adapter-mid>
            </mdb-resource-adapter>
        </ejb>
    </enterprise-beans>
</glassfish-ejb-jar>

我启动了activeMQ、glassfish(处于调试模式以便我可以看到消息)并打开了控制台(http://localhost:8161/admin)。我创建了一个名为 amqQueue 的新队列。我创建了一条新消息(在 activeMQ 控制台中发送),将目标设置为 amqQueue 并在消息正文中输入了一些文本。点击发送,代码中触发断点。

【讨论】:

    猜你喜欢
    • 2015-11-25
    • 1970-01-01
    • 2021-03-06
    • 2021-04-02
    • 2020-01-17
    • 1970-01-01
    • 2015-07-16
    • 2015-09-23
    • 1970-01-01
    相关资源
    最近更新 更多