有没有更好的方法使用RabbitMQ来消耗多线程消息?

时间:2019-05-30 02:05:30

标签: java rabbitmq

我目前正在学习如何使用RabbitMQ调度作业并将其分配到其他VM。 VM上的工作程序需要完成一些硬加载工作,如果成功完成,则需要返回服务器。

我已经在官方api上做了一些调查,也在这里,试图测试它是否可以工作。

Connection connection = factory.newConnection();
final Channel channel = connection.createChannel();
channel.basicQos(10);
Consumer consumer = new DefaultConsumer(channel) {
    @Override
    public void handleDelivery(String consumerTag, final Envelope envelope, AMQP.BasicProperties properties, final byte[] body) throws IOException {
        Thread th = new Thread() {public void run() {
        try{
        //do some jobs here...
        synchronized (this) {channel.basicAck(envelope.getDeliveryTag(), false);}
        } catch (Exception e) {
            e.printStackTrace();
            try {
                synchronized (this) {channel.basicReject(envelope.getDeliveryTag(), false)}
            } catch (IOException e1) {e1.printStackTrace();}
        }
        };
        th.start();
    }
};
channel.basicConsume(queueName, false, consumer);

此代码对我有用。但是我只是想知道是否有更好,更线程安全的方法。

1 个答案:

答案 0 :(得分:1)

如何为每个消息使用ExecutorService而不是新线程?根据传入消息的速率,您的方法创建的线程数量会非常迅速地增大,这可能会降低服务质量。