我正在运行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
的用户。预定义了两个持久队列。其中一个就是这里使用的队列。
是否有可能无法传递邮件?还有什么我可以有用地检查,以了解为什么这不起作用?
修改
我尝试了几种不同的队列名称。
这些名字都不起作用。
答案 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搜索。