以前在單項目中用過RabbitMQ,沒有問題 不過這次在分散式項目中使用RabbitMQ中有點搞糊塗了,但是實際上是沒有問題的,思路清晰就行 簡單看一下實際操作的示例吧: 資源文件中需要配置基本的rabbitMQ的屬性,如下: 然後要配置applicationContext-rabbitmq.xml ...
以前在單項目中用過RabbitMQ,沒有問題
不過這次在分散式項目中使用RabbitMQ中有點搞糊塗了,但是實際上是沒有問題的,思路清晰就行
簡單看一下實際操作的示例吧:
資源文件中需要配置基本的rabbitMQ的屬性,如下:
1 #rabbitmq config 2 rabbitmq.host=192.168.1.188 3 rabbitmq.port=5672 4 rabbitmq.username=lee 5 rabbitmq.password=lee 6 rabbitmq.vhost=danger
然後要配置applicationContext-rabbitmq.xml,這個文件需要新建,當然你也可以在你的service.xml中編寫,但是為了配置清晰嘛
內容如下:
1 <!-- 定義RabbitMQ的連接工廠 --> 2 <rabbit:connection-factory id="connectionFactory" 3 host="${rabbitmq.host}" 4 port="${rabbitmq.port}" 5 username="${rabbitmq.username}" 6 password="${rabbitmq.password}" 7 virtual-host="${rabbitmq.vhost}" /> 8 9 <!-- 定義消息管理員 --> 10 <rabbit:admin connection-factory="connectionFactory"/> 11 12 <!-- 生產者需要以下 --> 13 <!-- 定義交換機 --> 14 <rabbit:topic-exchange name="rest-content-exchange" durable="true" auto-declare="true"> 15 <!-- 如果是2個不同的系統進行通知,那就手動在管理後臺進行綁定 --> 16 <rabbit:bindings> 17 <rabbit:binding queue="rest-sms-queue" pattern="rest.sms.#"/> 18 <rabbit:binding queue="rest-jpush-queue" pattern="rest.jpush.#"/> 19 <rabbit:binding queue="rest-sysmsg-queue" pattern="rest.sysmsg.#"/> 20 </rabbit:bindings> 21 </rabbit:topic-exchange> 22 23 <!-- 定義rabbitTemplate --> 24 <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory" exchange="rest-content-exchange"/> 25 26 27 <!-- 消費者需要以下 --> 28 <!-- 定義隊列 --> 29 <rabbit:queue name="rest-sms-queue" durable="true" auto-declare="true"/> 30 <rabbit:queue name="rest-jpush-queue" durable="true" auto-declare="true"/> 31 <rabbit:queue name="rest-sysmsg-queue" durable="true" auto-declare="true"/> 32 33 <!-- 消費者 --> 34 <bean id="smsHandler" class="com.dingli.components.mq.handler.SmsHandler"></bean> 35 <bean id="jpushHandler" class="com.dingli.components.mq.handler.JpushHandler"></bean> 36 <bean id="saveSysMsgHandler" class="com.dingli.components.mq.handler.SaveSysMsgHandler"></bean> 37 38 <!-- 隊列監聽 --> 39 <!-- TODO 註釋了後臺不會滾動顯示 --> 40 <rabbit:listener-container connection-factory="connectionFactory" acknowledge="none" > 41 <rabbit:listener ref="smsHandler" method="excute" queue-names="rest-sms-queue" /> 42 <rabbit:listener ref="jpushHandler" method="excute" queue-names="rest-jpush-queue" /> 43 <rabbit:listener ref="saveSysMsgHandler" method="saveMsgExcute" queue-names="rest-sysmsg-queue" /> 44 </rabbit:listener-container>
這裡需要註意acknowledge,這個屬性預設是auto,如果消費者報錯了,會一直報錯,因為他是輪詢監聽的,可以修改為none或者manul
再看看實現的消費者以及助手類,助手類可以理解為service
監聽3個routing-key
1 @Component 2 public class SendMsgRestProducerImpl implements SendMsgRestProducer { 3 4 @Autowired 5 private RabbitTemplate rabbitTemplate; 6 7 @Override 8 public void sendSMS(String mqSMSMessageJson) { 9 rabbitTemplate.convertAndSend("rest.sms.send", mqSMSMessageJson); 10 } 11 12 @Override 13 public void jpushContent(String mqJPushMessageJson) { 14 rabbitTemplate.convertAndSend("rest.jpush.send", mqJPushMessageJson); 15 } 16 17 @Override 18 public void saveContent(String mqSysMessageJson) { 19 rabbitTemplate.convertAndSend("rest.sysmsg.send", mqSysMessageJson); 20 } 21 22 }
這樣,直接調用componentImpl就行了!並且這3個都是非同步的
為什麼要使用RabbitMQ,那就是效率問題,有些主流程實現後,附流程你不在乎,成功不成功不影響,頂多重發一次,這樣的業務可以使用消息隊列
當然也有更多更複雜的也需要用的,這裡的業務場景就比較簡單了,好吧,看官們親拍~