Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Rabbitmq-新消费者未收到任何信息_Java_Rabbitmq_Consumer - Fatal编程技术网

Java Rabbitmq-新消费者未收到任何信息

Java Rabbitmq-新消费者未收到任何信息,java,rabbitmq,consumer,Java,Rabbitmq,Consumer,我使用rabbitMQ将任务发送给运行时创建的workers使用者。当前,每次创建新任务时,都会创建一个新的工作进程。问题是这样的: -用户创建一个任务 -创建一个worker,然后将任务发送到队列中供worker处理 -工人开始处理队列,工人基本上睡了一段时间 -另一个用户创建一个任务 -在队列上创建新工作进程并发送任务 -新员工不处理新任务,同时什么也不做,新任务在第一个员工完成第一个任务后由他处理 我检查了rabbitmq的管理部分,有两个使用者绑定到队列,但其中一个似乎完成了所有工作,而

我使用rabbitMQ将任务发送给运行时创建的workers使用者。当前,每次创建新任务时,都会创建一个新的工作进程。问题是这样的: -用户创建一个任务

-创建一个worker,然后将任务发送到队列中供worker处理

-工人开始处理队列,工人基本上睡了一段时间

-另一个用户创建一个任务

-在队列上创建新工作进程并发送任务

-新员工不处理新任务,同时什么也不做,新任务在第一个员工完成第一个任务后由他处理

我检查了rabbitmq的管理部分,有两个使用者绑定到队列,但其中一个似乎完成了所有工作,而另一个只是等待

以下是工作人员的代码: 公共类工作线程扩展{

private final static String QUEUE_NAME = "Tasks";
private final static String QUEUE_COMPL = "Completed";
public static int id = 0;
private static final String EXCHANGE_NAME = "logs";
public int compteur;
String identifier;

public Worker() {
    Worker.id++;
    compteur = id;
}
public void run() {
    try {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        channel.basicQos(1);
        final Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body, "UTF-8");
                System.out.println("WORKER " + compteur + " : Message received :" + message);

                String taskName = message.split(" ")[0];
                String length = message.split(" ")[1];

                try {
                    System.out.println("WORKER " + compteur + " : Commencing job :" + message);
                    doWork(length);
                    System.out.println("WORKER " + compteur + " : Job's finished :" + message);
                    taskName += " done by " + compteur;
                   // confirm(taskName);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } finally {
                    System.out.println("WORKER " + compteur + " : Waiting for a new task...");
                }

            }
        };

        channel.basicConsume(QUEUE_NAME, true, consumer);
    } catch (IOException ex) {
            Logger.getLogger(Worker.class.getName()).log(Level.SEVERE, null, ex);
    } catch (TimeoutException ex) {
            Logger.getLogger(Worker.class.getName()).log(Level.SEVERE, null, ex);
    }
}

private static void doWork(String taskLength) throws InterruptedException {
    int temps = Integer.parseInt(taskLength);
    Thread.sleep(temps);
}
}
以及将消息放入队列的部分的代码: 公共类服务{

private final static String QUEUE_NAME = "Tasks";
private  Manager MANAGER = new Manager();

@WebMethod(operationName = "processTask")
public String processTask(@WebParam(name = "message") String txt, @WebParam(name = "duree") int duree) throws IOException, TimeoutException {
    if (MANAGER == null){
        MANAGER= new Manager();
        MANAGER.listen();
    }
    System.out.println("SERVER : Message received : " + txt + " " + duree);
    MANAGER.giveTask();
    ConnectionFactory factory = new ConnectionFactory();
    String message = txt + " " + duree;
    System.out.println("SERVER : Sending message to workers : " + message);
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();
    channel.queueDeclare(QUEUE_NAME, false, false, false, null);

    channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
    channel.close();
    connection.close();       
    return "Your task is being processed";
}
}
经理是一个创造忙碌工人的职业

如果已经有人问过类似的问题,我很抱歉,但我找不到。
谢谢您的帮助:

好吧,我似乎已经找到了一种让它工作的方法,问题是我不知道它为什么工作,所以如果有人知道,我很乐意给出一个解释


我将channel.basicConsumeQUEUE_NAME,true,consumer;的第二个参数改为false,但我不确定它为什么能解决我的问题。

好的,我似乎找到了一种方法使它工作,问题是我不知道它为什么工作,所以如果有人知道,我很乐意给出解释


我将channel.basicConsumeQUEUE_NAME,true,consumer;的第二个参数更改为false,但我不确定它为什么解决了我的问题。

basicConsume方法的第二个参数是auto acknowledge。将此参数设置为true意味着使用者将告诉RabbitMQ消息已被确认,如下所示一旦它收到消息

当使用者设置为autoAck true时,它很可能会立即从队列接收下一条可用消息,即使Basickos设置为1。这种情况会发生,因为使用者会立即减少1限制,即它不再有任何消息,并且可以接受下一条消息

将auto ack参数更改为false可防止此问题,当与基本QoS设置1结合使用时,因为这会迫使您的消费者说“嗨,我收到了一条消息,我正在处理它。在完成之前,请不要向我发送任何其他信息。”


这允许另一个使用者说“嘿,我有一个打开的位置”。继续并向我发送消息

basicConsume方法的第二个参数是auto acknowledge。将此参数设置为true意味着使用者在收到消息后将立即告诉RabbitMQ消息已被确认

当使用者设置为autoAck true时,它很可能会立即从队列接收下一条可用消息,即使Basickos设置为1。这种情况会发生,因为使用者会立即减少1限制,即它不再有任何消息,并且可以接受下一条消息

将auto ack参数更改为false可防止此问题,当与基本QoS设置1结合使用时,因为这会迫使您的消费者说“嗨,我收到了一条消息,我正在处理它。在完成之前,请不要向我发送任何其他信息。”

这样,另一位消费者就可以说,嘿,我有一个空位。请继续向我发送消息