我使用ActiveMQ作为代理和JMS来接收异步。队列中的消息一旦消息进入队列就开始消耗这些消息。 为此,我有书面的制作人和消费者代码。 一切都运行正常,但整个过程花费了大约2-3分钟的时间来处理10000条记录。(我使用了一个循环只是为了模拟) 以下是整个代码:
这是JMS Producer:
public class JmsMessageProducer
{
public void jmsListener(String obj) throws Exception
{
BrokerService broker = BrokerFactory.createBroker(new URI("broker:(tcp://localhost:61616)"));
broker.start();
Connection connection = null;
Session session = null;
MessageProducer producer = null;
try
{
long millis = System.currentTimeMillis() % 1000;
// Producer
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
connection = connectionFactory.createConnection();
session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("customerQueue3");
MessageConsumer consumer = session.createConsumer(queue);
consumer.setMessageListener(new ConsumerMessageListener("Consumer3"));
connection.start();
producer = session.createProducer(queue);
for(int i=0; i<10000; i++)
{
String payload = "Important Task"+i;
Message msg = session.createTextMessage(payload);
System.out.println("Sending text '" + payload + "'");
producer.send(msg);
}
long millis2 = System.currentTimeMillis() % 1000;
long millis3 = millis2- millis;
System.out.println("time taken: "+ millis3 );
}
finally
{
if(producer != null)
{
producer.close();
}
if (session != null)
{
session.close();
}
if (connection != null)
{
connection.close();
}
broker.stop();
}
}
}
这是听众代码:
public class ConsumerMessageListener implements MessageListener
{
private String consumerName;
public ConsumerMessageListener(String consumerName)
{
this.consumerName = consumerName;
}
DummyAdapter adapter = new DummyAdapter();
public void onMessage(Message message)
{
TextMessage textMessage = (TextMessage) message;
try
{
System.out.println(consumerName + " received "+ textMessage.getText());
// adapter.dummy(textMessage.getText());
}
catch (JMSException e)
{
e.printStackTrace();
}
}
}
我是第一次这样做。 谁能告诉我为什么这个过程需要花费太多时间? 我究竟做错了什么?
答案 0 :(得分:1)
我不确定您期望的SLA,但您的消息Broker正以80消息/秒(大约)的速度工作,这不错。
您的代码的一个问题是session.createProducer(queue)
是时滞的问题,因为它是一项代价高昂的操作(需要时间),您可以使用单个生产者对象来生成多条消息。
所以在for循环之外创建MessageProducer
,如下所示:
MessageProducer producer = session.createProducer(queue);
for(int i=0; i<10000; i++) {
String payload = "Important Task"+i;
Message msg = session.createTextMessage(payload);
System.out.println("Sending text '" + payload + "'");
producer.send(msg);
}
close
区块中您必须producer
个session
和finally
个对象。
PS:另外,作为旁注,如果您将生产者class
的名称命名为JmsMessagePrducer
而不是JmsMessageListener
,那将是一件好事,因为我们通常将名称命名为{{ 1}}仅适用于Listener
个消费者。
<强>更新强>
我只是想知道在80左右处理是好事 消息/秒。?消费后也没有任何操作。如果 消息从队列消耗后添加更多任务,如插入 db或一些业务操作。
在不知道哪个服务器/操作系统/等...(需要考虑许多参数)的情况下,简单地告知80消息/秒更好或50消息/秒更好是不明智的。在性能要求方面,您需要首先指定/定义要求。
如果您当前的代码处理大约80条消息/秒,那么对于给定的条件,这就是您的应用程序(测试程序)基准。因此,如果您认为它不符合您的性能要求,那么您需要配置多个JMS侦听器以并行处理消息并更改您的设计。