Есть ли лучший способ использовать rabbitMQ для потребления многопоточных сообщений? - PullRequest
0 голосов
/ 30 мая 2019

В настоящее время я изучаю, как использовать RabbitMQ для планирования и отправки заданий на разные виртуальные машины. Сейчас я работаю на рабочей стороне. Работник на виртуальной машине должен выполнить некоторые тяжелые задания и вернуться к серверу, если он будет успешно выполнен.

Я провел несколько опросов на официальном 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 Ответ

1 голос
/ 30 мая 2019

Как насчет использования ExecutorService вместо новой темы для каждого сообщения? В зависимости от скорости входящих сообщений количество потоков, создаваемых вашим подходом, может очень быстро увеличиваться, что может привести к остановке вашего сервиса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...