消息生产者代码
public class Send {
public final static String QUEUE_NAME = "com.lyyz.queue";
public final static String EXCHANGE_NAME = "com.lyyz.exchange";
public final static String ROUTINGKEY_NAME = "com.lyyz.routingKey";
public final static String EXCHANGE_TYPE = "TOPIC";
public static String message = "Hello World!";
private static Scanner scanner = new Scanner(System.in);
private static boolean sysIn() {
message = scanner.nextLine();
if (message.length() == 0) return false;
return true;
}
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
factory.setPort(5672);
factory.setUsername("root");
factory.setPassword("root");
factory.setVirtualHost("/");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
switch(EXCHANGE_TYPE){
case("DEFAULT"):
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
while(sysIn()){
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
}
break;
case("FANOUT"):
channel.exchangeDeclare(EXCHANGE_NAME,"fanout");
while(sysIn()){
channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
}
break;
case("DIRECT"):
channel.exchangeDeclare(EXCHANGE_NAME,"direct");
while(sysIn()){
channel.basicPublish(EXCHANGE_NAME, ROUTINGKEY_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
}
break;
case("HEADERS"):
channel.exchangeDeclare(EXCHANGE_NAME, "headers");
while(sysIn()){
Map<String, Object> headers = new HashMap<String, Object>();
headers.put("key", "key");
AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder().headers(headers);
channel.basicPublish(EXCHANGE_NAME, ROUTINGKEY_NAME, builder.build(), message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
}
break;
case("TOPIC"):
channel.exchangeDeclare(EXCHANGE_NAME,"topic");
while(sysIn()){
channel.basicPublish(EXCHANGE_NAME, ROUTINGKEY_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
}
break;
default:
}
channel.close();
connection.close();
}
}
消息消费者代码
public class Recv1 {
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory()
factory.setHost("127.0.0.1")
factory.setPort(5672)
factory.setUsername("root")
factory.setPassword("root")
factory.setVirtualHost("/")
Connection connection = factory.newConnection()
Channel channel = connection.createChannel()
String queueName = ""
switch(Send.EXCHANGE_TYPE){
case("DEFAULT"):
//默认情况 直接声明队列
channel.queueDeclare(Send.QUEUE_NAME, false, false, false, null)
System.out.println(" [*] Waiting for messages. To exit press CTRL+C")
queueName = Send.QUEUE_NAME
break
case("FANOUT"):
//声明 交换机
channel.exchangeDeclare(Send.EXCHANGE_NAME,"fanout")
//声明一个临时队列,该队列会在使用完比后自动销毁
queueName = channel.queueDeclare().getQueue()
//将队列绑定到交换机,参数3无意义此时
channel.queueBind(queueName,Send.EXCHANGE_NAME,"")
System.out.println(" [*] Waiting for messages. To exit press CTRL+C")
break
case("DIRECT"):
channel.exchangeDeclare(Send.EXCHANGE_NAME,"direct")
queueName = channel.queueDeclare().getQueue()
//将队列绑定到交换机,根据routingkey参数绑定
channel.queueBind(queueName,Send.EXCHANGE_NAME,Send.ROUTINGKEY_NAME)
System.out.println(" [*] Waiting for messages. To exit press CTRL+C")
break
case("HEADERS"):
channel.exchangeDeclare(Send.EXCHANGE_NAME,"headers")
queueName = channel.queueDeclare().getQueue()
Map<String, Object> headers = new HashMap<String, Object>()
headers.put("key", "key1")
headers.put("x-match", "any")
//将队列绑定到交换机,根据headers参数绑定
channel.queueBind(queueName,Send.EXCHANGE_NAME,Send.ROUTINGKEY_NAME,headers)
System.out.println(" [*] Waiting for messages. To exit press CTRL+C")
break
case("TOPIC"):
channel.exchangeDeclare(Send.EXCHANGE_NAME,"topic")
queueName = channel.queueDeclare().getQueue()
//监听两种模式 #匹配一个或多个单词 *匹配一个单词
channel.queueBind(queueName,Send.EXCHANGE_NAME,"com.#")
channel.queueBind(queueName,Send.EXCHANGE_NAME,"com.lyyz.*")
System.out.println(" [*] Waiting for messages. To exit press CTRL+C")
break
default:
}
//定义一个消费者 接收消息
DefaultConsumer 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(" [x] Received '" + message + "'")
}
}
// 在同一时间不要给一个worker一个以上的消息。
// 不要将一个新的消息分发给worker知道它处理完了并且返回了前一个消息的通知标志(acknowledged)
// 替代的,消息将会分发给下一个不忙的worker。
channel.basicQos(1)
//为channel声明一个consumer,服务器会推送消息
//参数1:队列名称
//参数2:是否发送ack包,不发送ack消息会持续在服务端保存,直到收到ack。 可以通过channel.basicAck手动回复ack
//参数3:消费者
channel.basicConsume(queueName, true, consumer)
}
}