1 package com.jiefupay; 2 3 import java.io.IOException; 4 import java.util.HashMap; 5 import java.util.Map; 8 6 import org.apache.log4j.Logger; 7 8 import com.jiefupay.dao.Dao; 9 10 import com.rabbitmq.client.AMQP; 11 import com.rabbitmq.client.Channel; 12 import com.rabbitmq.client.Connection; 13 import com.rabbitmq.client.ConnectionFactory; 14 import com.rabbitmq.client.Consumer; 15 import com.rabbitmq.client.DefaultConsumer; 16 import com.rabbitmq.client.Envelope; 17 18 public class App{ 19 20 private static final Logger log = Logger.getLogger(App.class); 26 21 private static final String EXCHANGE_NAME = "refreshDispatcherMemoryExchange"; 22 23 private static String QUEUE_NAME = "refreshDispatcherMemoryhfQueue"; 24 25 public static void main(String[] args) throws Exception { 26 27 ConnectionFactory factory = new ConnectionFactory(); 28 factory.setHost("127.0.0.1"); 29 factory.setPort(5672); 30 factory.setUsername("yourusername"); 31 factory.setPassword("yourpassword"); 32 33 //0.创建连接和通道 34 Connection connection = factory.newConnection(); 35 Channel channel = connection.createChannel(); 36 37 //1.声明一个死信交换机(扇形交换机) 38 channel.exchangeDeclare("refreshDispatcherDeadExchange", "fanout"); 39 40 //2.创建队列的参数 41 Map<String, Object> queueArgs = new HashMap<String, Object>(); 42 queueArgs.put("x-dead-letter-exchange", "refreshDispatcherDeadExchange"); //死信队列 43 queueArgs.put("x-message-ttl", 10000); // 消息超时:让发布的message在队列中可以存活多长时间,以毫秒为单位。 44 queueArgs.put("x-expires", 1000); // 队列超时:当前的queue在指定的时间内,没有消费者订阅就会被删除,以毫秒为单位。 45 queueArgs.put("x-max-length", 100); // 队列最大长度:当超过了这个大小的时候,会删除之前最早插入的消息为本次的留出空间。 46 queueArgs.put("x-queue-mode", "lazy"); //延迟加载:queue的信息尽可能的都保存在磁盘上,仅在有消费者订阅的时候才会加载到RAM中。 47 48 //3.声明队列。-将队列参数传到队列 (队列名字,是否持久化,是否排外,是否自动清理,参数) 49 channel.queueDeclare(QUEUE_NAME, true, false, false, queueArgs); 50 51 //4.队列绑定交换机。 绑定键的意义依赖于转发器的类型,对于fanout类型,忽略此参数(第三个参数为binding key)。 52 channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ""); 53 54 Consumer consumer = new DefaultConsumer(channel) { 55 @Override 56 public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, 57 byte[] body) throws IOException { 58 // 捕获消息内容 59 String message = new String(body, "UTF-8"); 60 61 try { 62 //消息处理(自己实现的方法) 63 messageHandler(message); 64 65 //消息确认 66 channel.basicAck(envelope.getDeliveryTag(), false); 67 68 }catch (Exception e) { 69 70 //出现异常,置为true,重新入队。 71 channel.basicAck(envelope.getDeliveryTag(), true); 72 73 //出现异常,不重新入队,而是reject入死信队列。 74 //channel.basicReject(envelope.getDeliveryTag(), false); 75 76 } 77 } 78 }; 79 //第二个参数值为false代表关闭RabbitMQ的自动应答机制,改为手动应答。 80 channel.basicConsume(QUEUE_NAME, false, consumer); 81 } 82 83 public static void messageHandler(String message) { 84 switch (message) { 85 case "loadQDProductData": // 渠道信息 渠道产品 86 Dao.loadQDProductDataToSystem(); 87 break; 88 case "loadQDGroupData": //渠道组 89 Dao.loadQDGroupDataToSystem(); 90 break; 91 case "loadCustomerData": // 客户信息 92 Dao.loadCustomerDataToSystem(); 93 break; 94 case "loadUserProductData": // 客户产品 95 Dao.loadUserProductDataToSystem(); 96 break; 97 default: 98 break; 99 } 100 log.info( message + " Done" ); 101 102 } 103 }