2

使用的技术。

  • 活动MQ 5.5.1
  • 玻璃鱼 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());
    }
}
4

1 回答 1

4

好的,所以在玩了很多之后,我得到了它的工作。事实证明,您无需创建连接器资源、连接池或管理对象资源即可接收来自活动 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 并在消息正文中输入了一些文本。单击发送并在代码中触发断点。

于 2011-10-25T10:53:51.617 回答