Apache Artemis代理不向SwiftMQ AMQP客户端

时间:2015-10-26 23:28:54

标签: java amqp

我正在运行Apache Artemis代理,版本1.1.0。

我使用像这样的SwiftMQ客户端创建一个会话。

AMQPContext ctx = new AMQPContext(AMQPContext.CLIENT);
Connection connection = new Connection(ctx, getBrokerHost(), getBrokerPort(), getUserName(), getPassword());
connection.setExceptionListener((exc) -> log().error(exc, "Problem with AMQP connection to {}", getBrokerHost()));
connection.connect();

// Parameters are maximum number of unsettled input and output messages
session = connection.createSession(50, 50);

在一个过程中,我通过

创建一个制作人
session.createProducer(queueName, QoS.AT_LEAST_ONCE)

在另一个过程中,我通过

创建一个消费者
session.createProducer(queueName, QoS.AT_LEAST_ONCE)

对于制作人,我可以通过

发送消息
AMQPMessage result = new AMQPMessage();
result.setAmqpValue(new AmqpValue(new AMQPString(value)));
producer.send(result);

这很有效。使用JMX,我可以看到队列中有消息。当我尝试通过

阅读它们时
AMQPMessage message = consumer.receive();

AMQPMessage message = consumer.receiveNoWait(listener);

其中listener将向阅读线程发送消息以调用其中一个receive,该调用将阻止或不返回任何消息,具体取决于版本。

JMX显示代理认为队列中有消费者,并且队列中有消息。邮件未在传递中列出,并且队列未暂停。队列中没有过滤器。

如果重要,消费者和生产者在同一主机上运行。代理程序在与生产者和使用者相同的主机上运行在Docker容器中(如果您不了解Docker,请考虑VM),但它具有不同的IP地址。

我添加了consumer.setLinkCredit(100),但这并没有影响任何内容。

可能有一些Artemis / SwiftMQ不兼容,但这似乎不太可能,因为我能够向经纪人发送消息。

经纪人几乎是标准经纪人。它是用

创建的
/opt/apache-artemis-1.1.0/bin/artemis create artemis  \
                                      --home /opt/apache-artemis \
                                      --user xxx \
                                      --password yyy \
                                      --cluster-user www \
                                      --cluster-password zzz \
                                      --allow-anonymous

添加了第二个角色为amq的用户。预定义了两个持久队列。其中一个就是这里使用的队列。

是否有可能无法传递邮件?还有什么我可以有用地检查,以了解为什么这不起作用?

修改

我尝试了几种不同的队列名称。

  • frobGetter
  • frobRequest
  • jms.queue.ExpiryQueue
  • jms.queue.DLQ
  • jms.queue.PlanningQueue

这些名字都不起作用。

2 个答案:

答案 0 :(得分:1)

我之前从未使用过SwiftMQ客户端,但我能够使用下面显示的代码使用Artemis v1.1.0和ActiveMQ v5.12.1。诀窍似乎是你需要在createConsumer调用中指定链接信用,consumer.setLinkCredit(100)似乎对消费者没有影响,因为在进行此调用时没有向代理发出任何信用。

package org.apache.activemq.demo;

import java.util.concurrent.TimeUnit;

import com.swiftmq.amqp.AMQPContext;
import com.swiftmq.amqp.v100.client.Connection;
import com.swiftmq.amqp.v100.client.Consumer;
import com.swiftmq.amqp.v100.client.ExceptionListener;
import com.swiftmq.amqp.v100.client.Producer;
import com.swiftmq.amqp.v100.client.QoS;
import com.swiftmq.amqp.v100.client.Session;
import com.swiftmq.amqp.v100.generated.messaging.message_format.AmqpValue;
import com.swiftmq.amqp.v100.messaging.AMQPMessage;
import com.swiftmq.amqp.v100.types.AMQPString;
import com.swiftmq.amqp.v100.types.AMQPType;

public class SwitftMQTest {

    public void run() throws Exception {
        AMQPContext ctx = new AMQPContext(AMQPContext.CLIENT);
        Connection connection = new Connection(ctx, "localhost", 5672, "guest", "guest");
        connection.setExceptionListener(new ExceptionListener() {

            @Override
            public void onException(Exception error) {
                System.out.println("Problem with AMQP connection: " + error.getMessage());
            }
        });

        connection.connect();

        // Parameters are maximum number of unsettled input and output messages
        Session session = connection.createSession(50, 50);

        Consumer consumer = session.createConsumer("jms.queue.TEST", 100, QoS.AT_LEAST_ONCE, false, null);

        Producer producer = session.createProducer("jms.queue.TEST", QoS.AT_LEAST_ONCE);
        AMQPMessage message = new AMQPMessage();
        message.setAmqpValue(new AmqpValue(new AMQPString("Test String")));

        producer.send(message);
        producer.close();

        System.out.println("Attempting to read a message.");
        message = consumer.receive(TimeUnit.MINUTES.toMillis(1));
        if (message != null) {
            AMQPType payload = message.getAmqpValue().getValue();
            System.out.println("Message payload = " + payload.toString());
        } else {
            System.out.println("Did not get a message in the time given.");
        }

        connection.close();
    }

    public static void main(String[] args) {
        SwitftMQTest testCase = new SwitftMQTest();

        try {
            testCase.run();
        } catch (Exception ex) {
            System.out.println("Problem with AMQP connection: " + ex.getMessage());
        }
    }
}

答案 1 :(得分:0)

artemis队列上有一个前缀。通常您必须将名称指定为jms.queue.QueueName ...

我最初在调查你的问题时添加了这个答案。 (我和Tim Bish一起工作,那个给出了另一个答案的人)。最后情况并非如此,但我想在这里保留这个答案,因为最终某些用户可以使用Google搜索。