记录以下一个rabbitmq消费者函数不执行的情况
生产者类
public class Producer {
public static final String QUEUE_NAME = "hello";
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("192.168.186.129");
connectionFactory.setUsername("admin");
connectionFactory.setPassword("123");
try(Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();){
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "hello rabbitmq";
channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
}
}
}
消费者类
public class Consumer2 {
public static final String QUEUE_NAME = "hello";
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.186.129");
factory.setUsername("admin");
factory.setPassword("123");
Connection connection=null;
Channel channel=null;
try {
connection = factory.newConnection();
channel = connection.createChannel();
/**
* queue
* autoAck
* deliverCallback
* cancelCallback
*/
DeliverCallback deliverCallback = (consumerTag, message) -> {
String mess = new String(message.getBody());
System.out.println(mess);
System.out.println("DeliverCallback----");
};
CancelCallback cancelCallback = (consumerTag) -> {
System.out.println("消息取消。。。");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);
} finally {
if (channel!=null){
channel.close();
}
if (connection!=null) {
connection.close();
}
}
}
}
先执行完生产者,后执行消费者,发现消费者没有打印任何东西,但是在rabbitmq的后台看见消息已经被消费了。
在channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);
后面添加了try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }
后就能打印出消息了。
应该是rabbitmq开启另外一个线程去执行回调函数,回调函数还没来得及执行,主线程已经执行完。
通过在DeliverCallback的回调函数中添加Thread.currentThread().getId()
,也发现了执行该函数的线程和执行main函数的主线程并不一致。
"D:\Program Files\Java8\bin\java" "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2017.3.4\lib\idea_rt.jar=61883:D:\Program Files\JetBrains\IntelliJ IDEA 2017.3.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java8\jre\lib\charsets.jar;D:\Program Files\Java8\jre\lib\deploy.jar;D:\Program Files\Java8\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java8\jre\lib\ext\cldrdata.jar;D:\Program Files\Java8\jre\lib\ext\dnsns.jar;D:\Program Files\Java8\jre\lib\ext\jaccess.jar;D:\Program Files\Java8\jre\lib\ext\jfxrt.jar;D:\Program Files\Java8\jre\lib\ext\localedata.jar;D:\Program Files\Java8\jre\lib\ext\nashorn.jar;D:\Program Files\Java8\jre\lib\ext\sunec.jar;D:\Program Files\Java8\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java8\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java8\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java8\jre\lib\ext\zipfs.jar;D:\Program Files\Java8\jre\lib\javaws.jar;D:\Program Files\Java8\jre\lib\jce.jar;D:\Program Files\Java8\jre\lib\jfr.jar;D:\Program Files\Java8\jre\lib\jfxswt.jar;D:\Program Files\Java8\jre\lib\jsse.jar;D:\Program Files\Java8\jre\lib\management-agent.jar;D:\Program Files\Java8\jre\lib\plugin.jar;D:\Program Files\Java8\jre\lib\resources.jar;D:\Program Files\Java8\jre\lib\rt.jar;D:\project\learnRabbitmq\rabbitmq-hello\target\classes;D:\maven\maven_repository\com\rabbitmq\amqp-client\5.8.0\amqp-client-5.8.0.jar;D:\maven\maven_repository\org\slf4j\slf4j-api\1.7.29\slf4j-api-1.7.29.jar;D:\maven\maven_repository\commons-io\commons-io\2.6\commons-io-2.6.jar" com.learn.rabbitmq.Consumer2
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
main thread--1
DeliverCallback thread--23
hello rabbitmq
-------
main thread--1
Process finished with exit code 0