java - 如何优化activemq

标签 java performance jakarta-ee jms activemq

我正在使用 ActiveMQ 模拟 Java 中的重载服务器。主要是它没问题,但是当我收到超过 600 个请求时,事情就变得糟糕了!

我认为瓶颈是我的主服务器,也就是下面这个人。我已经在重用连接并创建各种 session 来使用来自客户端的消息。就像我说的,我在每个连接上使用大约 50-70 个 session ,重新利用连接和队列。知道我可以重用/优化下面的组件/监听器吗?

架构如下:

* = 各种

Client ---> JMS MasterQueue ---> * Master ---> JMS SlavaQueue ---> * SlaveQueue

主要是我为每个 Master session 创建一个临时队列 --> Slave 通信,这对性能来说是个大问题吗?

/**
 * This subclass implements the processing log of the Master JMS Server to
 * propagate the message to the Server (Slave) JMS queue.
 *
 * @author Marcos Paulino Roriz Junior
 *
 */
public class ReceiveRequests implements MessageListener {
    public void onMessage(Message msg) {
        try {
            ObjectMessage objMsg = (ObjectMessage) msg;

            // Saves the destination where the master should answer
            Destination originReplyDestination = objMsg.getJMSReplyTo();

            // Creates session and a sender to the slaves
            BankQueue slaveQueue = getSlaveQueue();
            QueueSession session = slaveQueue.getQueueConnection()
                    .createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
            QueueSender sender = session
                    .createSender(slaveQueue.getQueue());

            // Creates a tempQueue for the slave tunnel the message to this
            // master and also create a masterConsumer for this tempQueue.
            TemporaryQueue tempDest = session.createTemporaryQueue();
            MessageConsumer masterConsumer = session
                    .createConsumer(tempDest);

            // Setting JMS Reply Destination to our tempQueue
            msg.setJMSReplyTo(tempDest);

            // Sending and waiting for answer
            sender.send(msg);
            Message msgReturned = masterConsumer.receive(getTimeout());

            // Let's check if the timeout expired
            while (msgReturned == null) {
                sender.send(msg);
                msgReturned = masterConsumer.receive(getTimeout());
            }

            // Sends answer to the client
            MessageProducer producerToClient = session
                    .createProducer(originReplyDestination);
            producerToClient.send(originReplyDestination, msgReturned);
        } catch (JMSException e) {
            logger.error("NO REPLY DESTINATION PROVIDED", e);
        }
    }
}

最佳答案

好吧,经过一些阅读我发现了如何优化。

我们应该重用一些 session 变量,比如sender和tempqueue。而不是创建新的。

另一种方法是降低 Java 中线程的堆栈大小,点击此链接 ActiveMQ OutOfMemory Can't create more threads

关于java - 如何优化activemq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1800774/

相关文章:

java - 从另一个 vector 中找出两个垂直 vector

java - Java 中的广义单例基类

java - 从链表中剪切一部分?

c# - 我应该使用哪种集合类型以获得最佳性能?

java - 如何在 Java 应用程序服务器中创建自定义对象池

java - 自定义代理复制 PDF

java - 在 gridLayout 中设置 JButton 大小

java - junit 不尊重 Maven 类路径

c# - Vector3是怎么实现的,为什么属性是只读的?

java - 上传文件大小超过限制时如何取消表单提交?