1

Here is the error I get when I run my main. I do not really understand why it is having as issue with line 44: channel.basicConsume(Q,true,consumer); My goal here is to try and store the messages received into a variable that I can use in other files.

The error is: Exception in thread "main" java.io.IOException
at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:105)
at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:101)
at com.rabbitmq.client.impl.ChannelN.basicConsume(ChannelN.java:1255)
at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.basicConsume(AutorecoveringChannel.java:471)
at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.basicConsume(AutorecoveringChannel.java:461)
at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.basicConsume(AutorecoveringChannel.java:456)
at Recv.recv(Recv.java:44)
at mainLaptop.main(mainLaptop.java:11)
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no queue 'Leonardo' in vhost '/', class-id=60, method-id=20)
at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66)
at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:32)
at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:366)
at com.rabbitmq.client.impl.ChannelN.basicConsume(ChannelN.java:1253)
... 5 more

Here is my code for the Recv file

    public class Recv 
    {

public static String recv(String ip, String Q) throws Exception 
{

    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost(ip);
    factory.setUsername("test");
    factory.setPassword("test");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();

    System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
    MyConsumer consumer=new MyConsumer(channel);
    channel.basicConsume(Q,true,consumer);

    return consumer.getStoredMessage();
}

public static class MyConsumer extends DefaultConsumer 
{
    private String storedMessage;

    public MyConsumer(Channel channel) 
    {
        super(channel);
    }

    public String getStoredMessage() 
    {
        return storedMessage;
    }

    @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(" [x] Received '" + message + "'");
        storedMessage = message; // store message here
    }
}
}
Jas
  • 53
  • 1
  • 9
  • Related, with potential debugging steps: https://stackoverflow.com/q/40789907/1531971 –  Apr 03 '18 at 20:09

1 Answers1

5

Many exceptions contain helpful pieces of information to tell you what is wrong, and what you can do to solve them.

In this case, your question is I do not really understand why it is having as issue with line 44: channel.basicConsume(Q,true,consumer);

Even though the stack trace is ugly, you need to read it, because the exception contains the following text:

Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no queue 'Leonardo' in vhost '/', class-id=60, method-id=20)

The error is very clear. No queue 'Leonardo' in vshost '/'. You have not declared the queue, which is passed in as string Q, in your RabbitMQ server. Thus, attempting to consume from a queue that doesn't exist is an exception. Declare the queue first, and your problem will go away.

theMayer
  • 15,456
  • 7
  • 58
  • 90
  • Thank you for clearing that up. I was actually aware of "No queue 'Leonardo' in vshost '/" however I thought Java executed simultaneously. I declare the que in my send file/class but I was calling it in my main after the recv file/class. Once I switched the order it worked! – Jas Apr 04 '18 at 03:11