6

如文档中所述,我通过在 activemq.xml(ActiveMQ 版本 5.2.0)中配置它来设置队列。

<destinations>
    <queue physicalName="FOO.BAR" />
    <queue physicalName="DUMMY" />
</destinations>

我正在尝试使用以下代码从java(在同一主机上)访问它:

Hashtable properties = new Hashtable();
properties.put(Context.INITIAL_CONTEXT_FACTORY, 
    "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
properties.put(Context.PROVIDER_URL, "tcp://localhost:61616");

context = new InitialContext(properties);

factory = (ConnectionFactory) context.lookup("ConnectionFactory");
connection = factory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
queueName = "DUMMY"; // which can be either FOO.BAR or DUMMY
dest = (Destination) context.lookup(queueName);

我收到以下错误,尽管队列在 jconsole(树/org.apache.activemq/队列)中可见:

javax.naming.NameNotFoundException: DUMMY

请告诉我我做错了什么。非常感谢!

4

2 回答 2

8

首先,您不必在代理中显式创建任何队列,尽管它没有害处。

此外,代理中可用的目的地也不会使用某种 JNDI 名称自动映射到 JNDI 上下文中。

您可以按照此处所述明确执行此操作。如果您想要 JNDI 的自动神奇填充,则使用dynamicQueues/DUMMY的 JNDI 命名约定作为您查找的 JNDI 名称(如动态创建目的地中所述)

于 2009-01-12T20:12:24.383 回答
0

嗯..好吧,当我想听队列时,我通常会做这样的事情。(从 javax.jms 导入)

队列队列;

    // Connect to ActiveMQ
    ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(messageBrokerURL);
    connection = factory.createConnection();
    session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

    // List to Dummy Queue
    queue = session.createQueue("DUMMY");
    messageConsumer = session.createConsumer(queue);
    messageConsumer.setMessageListener(queueHandler);

    // Start the connection
    connection.start();

并确保您的 Handler 实现了 MessageListener。

于 2009-01-12T21:40:38.400 回答