【问题标题】:JMeter custom sampler - share same connections with multiple runTestJMeter 自定义采样器 - 与多个 runTest 共享相同的连接
【发布时间】:2018-04-20 16:52:48
【问题描述】:

我通过扩展 AbstractJavaSamplerClient 成功地创建了自定义采样器。在采样器实现中,我正在建立 JMS 连接并将消息发送到队列。这很好用。如果我使用 Ramp-up 1 将线程组配置为 100,我的采样器将推送 100 条消息。

现在我想做的是在 JMeter 启动时只建立一次连接,然后在每次运行时重复使用相同的连接来发送消息。

谁能解释一下如何在 JMeter 启动时创建一个连接,然后与采样器共享相同的连接。

注意:我不能使用现有的 JMS 发布者,因为我想根据不同的应用程序事件计算我的响应时间,而不仅仅是计算将消息发布到 JMS 所花费的时间。

提前致谢。

【问题讨论】:

  • @user7294900 感谢分享链接。我已经访问过此链接,但它不适合我的要求,因为在我的情况下,它是一个自定义采样器,我需要了解如何实现连接共享。

标签: jmeter jms load-testing extend jmeter-plugins


【解决方案1】:

您可以使用testStarted method 来初始化所有线程的连接。请注意,此方法在克隆线程之前运行一次,因此在testStarted 中,您需要一个连接池,然后线程可以从中获取。例如,一个非常原始的连接池将是一个映射,其中包含某个键的顺序 ID 和连接对象。每个线程将根据线程号从该池中获取一个连接:

所以这样简单的池可以初始化为:

@Override
public void testStarted()
{
    int maxConnections = getThreadContext().getThreadGroup().getNumThreads(); 

    ConcurrentMap<Integer, Object> connections = new ConcurrentHashMap<Integer, Object>();

    for(int i = 0; i < maxConnections; i++)
    {
        Object connection = //... whatever you need to do to connect
        connections.put(new Integer(i), connection);
    }

    // Put in the context of thread group
    JMeterContextService.getContext().getVariables().putObject("MyConnections", connections);
}

(连接对象可以是更具体的类型,根据您的需要)。

稍后你可以在sample方法中使用它:

// Get connections pool from context
ConcurrentMap<Integer, Object> connections = (ConcurrentHashMap<Integer, Object>) JMeterContextService.getContext().getVariables().getObject("MyConnections");
// Find connection by thread ID, so each thread goes to a different connection
connections.get(getThreadContext().getThreadNum());

在这里,我天真地假设在运行时返回的线程号和用于连接初始化的初始顺序整数之间存在完美映射。不是最好的假设,可以改进,但它是一个有效的起点。

然后您可以关闭和删除testEnded method 中的连接。这个方法也运行一次,所以我们关闭所有连接:

@Override
public void testEnded()
{
    for(Entry<Integer, Object> connection : connections.entrySet())
    {
        connection.close(); // or do whatever you need to close it
        connections.remove(connection.getKey());
    }
}

或者你也可以在所有连接都关闭后直接调用connections.clear()

披露:我没有直接测试这个答案中的代码,而是使用了过去类似的代码片段,并重复使用它们来回答这个问题。如果您发现任何问题,请随时更新此答案。

【讨论】:

  • 非常感谢您提供详细信息。我会尝试您的建议,然后将结果回复您。
  • 我尝试从您的答案中实现代码,但方法 testStarted 和 testEnded 未在 AbstractJavaSamplerClient 中声明以覆盖。在我的采样器中,目前我正在扩展 AbstractJavaSamplerClient 并覆盖 runTest 方法。请澄清我是否需要从其他类扩展我的采样器以覆盖 testStarted 和 testEnded 方法。谢谢
  • 知道了。现在我扩展了 AbstractSampler,实现了 TestBean 并覆盖了 testStarted 和 testEnded。工作得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
相关资源
最近更新 更多