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 }