扩展AbstractJavaSamplerClient时如何管理连接?

时间:2015-08-27 14:53:56

标签: java jmeter rabbitmq

我希望扩展AbstractJavaSamplerClient以便我可以向RabbitMQ发送消息。我目前的设置是:

  • 将连接和渠道对象作为实例成员
  • setupTest()
  • 中创建连接和频道连接
  • runTest()
  • 中发送消息
  • 清除teardownTest()
  • 中的连接

代码:

package com.the.package.samplers.TheSampler

import ...
...

public final class TheSampler extends AbstractJavaSamplerClient {
    private final ConnectionFactory factory = new ConnectionFactory();
    private Connection connection = null;
    private Channel channel = null;
    ...

    @Override
    public Arguments getDefaultParameters() {
        Arguments parameters = new Arguments();
        ...
        return parameters;

    @Override
    public void setupTest(JavaSamplerContext context) {
        ...
        factory.setHost(host);
        factory.setVirtualHost(vhost);
        factory.setPort(port);
        factory.setUsername(username);
        factory.setPassword(password);

        routingKey = queue;

        try {
            connection = factory.newConnection();
            channel = connection.createChannel();
            channel.exchangeDeclare(exchange, EXCHANGE_TYPE, true);
            channel.queueDeclare(queue, true, false, false, null);
            channel.queueBind(queue, exchange, routingKey);
        }
        catch(IOException e) {
            ...
        }
    }

    @Override
    public SampleResult runTest(JavaSamplerContext context) {
        ...
        channel.basicPublish(exchange, routingKey, null, message.getBytes());
        ...
    }

    @Override
    public void teardownTest(JavaSamplerContext context) {
        try {
            channel.close();
            connection.close();
        }
        catch(IOException e) {
            ...
        }
    }
}

用5个线程运行JMeter测试一段时间后,消息率下降,我开始看到以下异常(无限期重复):

ERROR - jmeter.threads.JMeterThread: Error while processing sampler 'Java Request' : com.rabbitmq.client.AlreadyClosedException: connection is already closed due to connection error; cause: java.net.SocketException: Connection reset
    at com.rabbitmq.client.impl.AMQChannel.ensureIsOpen(AMQChannel.java:190)
    at com.rabbitmq.client.impl.AMQChannel.transmit(AMQChannel.java:291)
    at com.rabbitmq.client.impl.ChannelN.basicPublish(ChannelN.java:647)
    at com.rabbitmq.client.impl.ChannelN.basicPublish(ChannelN.java:630)
    at com.rabbitmq.client.impl.ChannelN.basicPublish(ChannelN.java:621)
    at com.the.package.samplers.TheSampler.runTest(TheSampler.java:102)
    at org.apache.jmeter.protocol.java.sampler.JavaSampler.sample(JavaSampler.java:191)
    at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:434)
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:261)
    at java.lang.Thread.run(Unknown Source)

我试图通过在runTest()中创建和关闭连接和通道对象来更加安全,但是这会产生巨大的性能损失(每秒最多触发50条消息,之前是在千计)。

在扩展AbstractJavaSamplerClient并使用多个线程运行时,有没有办法安全地创建与RabbitMQ的连接?

1 个答案:

答案 0 :(得分:0)

我在您的代码中看不到您显示的内容中的任何问题。

JMeter在rabbitmq服务器上的位置是什么?即他们之间是否有防火墙?

你应该检查一下:

  

使用心跳检测死TCP连接