锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍦ˋctiveMQ涓紝Broker浠h〃涓涓繍琛岀殑MQ鑺傜偣錛孉ctiveMQ鐨勬彃浠跺疄闄呬笂鏄熀浜嶣roker鐨勪竴涓狥ilter閾撅紝鏁翠釜璁捐綾諱技浜巗ervlet鐨凢ilter緇撴瀯錛屾墍鏈夌殑Plugin鏋勬垚涓涓摼寮忕粨鏋勶紝姣忎釜鎻掍歡瀹為檯涓婇兘鏄竴涓?Interceptor"錛岀被緇撴瀯鍥懼涓嬶細(xì)
鍏朵腑Broker鎺ュ彛灝佽浜嗕竴涓狝MQ鑺傜偣鐨勬柟鏂歸潰闈㈢殑鏂規(guī)硶錛屽寘鎷繛鎺ョ鐞嗐乻ession綆$悊銆佹秷鎭殑鍙戦佸拰鎺ユ敹浠ュ強(qiáng)鍏跺畠鐨勪竴浜涘姛鑳斤紝BrokerFilter瀹炵幇榪欎釜鎺ュ彛錛屽茍鎻愪緵浜嗛摼寮忕粨鏋勬敮鎸侊紝鍙互鎷︽埅鎵鏈塀roker鏂規(guī)硶鐨勫疄鐜板茍浼犻掔粨鏋滅粰閾懼紡緇撴瀯鐨勪笅涓涓紝褰㈡垚浜嗕竴涓畬鏁寸殑"鑱岃矗閾?妯″紡錛屽叿浣撳眰嬈″叧緋誨涓嬶紝鍏朵腑錛?System Plugin"鏄寚AMQ鍐呴儴浣跨敤Plugin鏈哄埗瀹炵幇鐨勪竴浜涚郴緇熷姛鑳斤紝鐢ㄦ埛涓嶈兘瀹氬埗錛?AMQ Plugin"鎸囩殑鏄疉ctiveMQ宸茬粡瀹炵幇濂戒簡錛屽彲浠ュ湪閰嶇疆鏂囦歡涓嚜鐢遍夋嫨鐨勪竴浜涙彃浠訛紝渚嬪綆鍗曠殑瀹夊叏鎻掍歡錛孞AAS瀹夊叏鎻掍歡鍜孌LQ鎻掍歡絳夌瓑錛岀敤鎴鋒彃浠跺氨鏄寚鐢ㄦ埛鑷繁瀹炵幇鐨刟mq鎻掍歡錛岄渶瑕佺敤鎴鋒妸鐩稿叧jar鍖呮斁鍏ュ埌amq鐨勫惎鍔╟lasspath涓紝騫跺湪閰嶇疆鏂囦歡涓繘琛岄厤緗墠鑳芥紜姞杞界殑鎻掍歡銆?/p>
鍦ㄤ笂闈㈣繖涓眰嬈$粨鏋勪腑錛屾渶涓嬮潰鐨凴egionBroker鏄牳蹇冪粍浠訛紝鍦ㄥ叾涔嬩笂鐨勯兘鏄疊roker鐨勬彃浠訛紝緇ф壙涔嬩簬BrokerFilter錛屽拰Broker淇濇寔鎺ュ彛鍏煎浣嗘槸鎵╁睍Broker鐨勫姛鑳姐?/p>
涓嬮潰涓句竴涓畝鍗曠殑渚嬪瓙錛屽叿浣撹鏄庝竴涓婣MQ鐨勬彃浠舵槸濡備綍宸ヤ綔鐨勩?/p>
鎴戜滑鍦ㄤ嬌鐢ˋMQ鐨勮繃紼嬩腑鍙戠幇錛屽湪嫻嬭瘯鐜緇存姢鏂歸潰鏈夊緢澶х殑楹葷儲錛屽叿浣撹〃鐜板湪寰堝鍚屽鍦ㄦ祴璇曢」鐩殑鏃跺欏線寰鍙叧娉ㄨ嚜宸遍」鐩壍娑夌殑闃熷垪錛屼笉浼?xì)鍘绘秷璐瑰叾浠?涓嶇浉鍏?鐨勯槦鍒楋紝榪欐牱瀵艱嚧鐨勪竴涓棶棰樺氨鏄疉ctiveMQ緇忓父鍙戠敓澶ч噺鏁版嵁闃誨錛屽鑷存祴璇曠幆澧冧笉鍙敤錛屽獎鍝嶇浉鍏抽」鐩殑嫻嬭瘯宸ヤ綔銆備負(fù)浜嗛伩鍏嶈繖涓棶棰橈紝鎴戜滑鍋囧畾鍦ㄦ祴璇曠幆澧冨彲浠ュ畾涔変互涓嬩竴浜涢檺鍒舵潯浠訛細(xì) 1銆?鎵鏈夐槦鍒楀爢縐秷鎭笉瓚呰繃1000鏉★紝瓚呰繃涔嬪悗绔嬪嵆娓呴櫎銆?/p>
2銆?娑堟伅瓚呰繃1涓皬鏃舵病鏈夋秷璐癸紝灝辯洿鎺ヨ繃鏈熴?/p>
鎴戜滑鍙互緙栧啓涓涓畝鍗曠殑amq鎻掍歡鏉ュ畬鎴愯繖涓や釜闄愬埗鏉′歡錛?/p>
棣栧厛錛岀紪鍐欎竴涓彃浠跺畨瑁呯被錛?/p>
package com.alibaba.napoli.plugins; import org.apache.activemq.broker.Broker;
public class MessageControlBrokerPlugin implements BrokerPlugin {
public Broker installPlugin(Broker broker) throws Exception {
鍏舵錛岀紪鍐欑湡姝g殑鎻掍歡瀹炵幇錛?/p>
package com.alibaba.napoli.plugins; import java.io.IOException; import org.apache.activemq.broker.Broker;
/**
public MessageControlBroker(Broker next) {
@Override
Message msg = null;
/**
}
} 鐒跺悗錛屽皢榪欎袱涓被鎵撳寘涓簃yplugin.jar錛屽茍鏀懼湪activemq鍚姩鐩綍涓嬬殑lib鐩綍涓?/p>
鏈鍚庯紝鍦╝ctivemq.xml鏂囦歡涓鍔犱竴涓畝鍗曠殑spring閰嶇疆欏癸細(xì) <bean xmlns="
id="purgePlugin"
鐒跺悗錛岄噸鍚痑ctivemq錛屽氨浼?xì)鍙戠幇杩欎釜鎻掍欢宸簿l忚鍔犺澆銆?/p>
import org.apache.activemq.broker.BrokerPlugin;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
private static Log log = LogFactory.getLog(StatisticsBrokerPlugin.class);
log.info("install MessageControlBrokerPlugin");
return new MessageControlBroker(broker);
}
}
import org.apache.activemq.broker.BrokerFilter;
import org.apache.activemq.broker.ConnectionContext;
import org.apache.activemq.broker.ProducerBrokerExchange;
import org.apache.activemq.broker.region.Destination;
import org.apache.activemq.broker.region.MessageReference;
import org.apache.activemq.broker.region.Queue;
import org.apache.activemq.command.Message;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
* 寮鍙戠幆澧冪鐞嗘彃浠訛紝絎﹀悎涓や釜鏉′歡榪涜娑堟伅娓呯悊錛?lt;br>
* 1 娑堟伅绱Н瓚呰繃1000鏉?
* 2 娑堟伅瓚呰繃1涓皬鏃舵棤浜烘秷璐?
* @author guolin.zhuanggl
*
*/
public class MessageControlBroker extends BrokerFilter {
public static Log log = LogFactory.getLog(DiscardingDLQBroker.class);
private static final long DEFAULT_EXPIRATION = 3600*1000;
private static final long DEFAULT_PURGE_COUNT = 1000;
super(next);
}
public void messageExpired(ConnectionContext context,
MessageReference message) {
try {
msg = message.getMessage();
} catch (IOException e) {
log.error("failed to fetch content: ",e);
}
purgeMessage(msg);
// TODO Auto-generated method stub
super.messageExpired(context, message);
}
* 娓呴櫎闃熷垪涓殑鎵鏈夋秷鎭?
*/
private void purgeMessage(Message message){
Destination r = message.getRegionDestination();
if(r instanceof Queue){
try {
//濡傛灉绱Н娑堟伅瓚呰繃1000涓紝娓呴櫎闃熷垪娑堟伅
if(((Queue) r).getMessages().size() > DEFAULT_PURGE_COUNT){
((Queue) r).purge();
}
} catch (Exception e) {
// TODO Auto-generated catch block
log.error("failed to purge queue "+r.getName(),e);
}
}
/**
* 褰撴秷鎭彂閫佹椂錛屽叏閮ㄨ緗繃鏈熸椂闂?涓皬鏃訛紝嫻嬭瘯鐜涓撶敤錛侊紒錛?
*/
@Override
public void send(ProducerBrokerExchange producerExchange,Message messageSend) throws Exception {
long oldExp = messageSend.getExpiration();
messageSend.setExpiration(oldExp < DEFAULT_EXPIRATION && oldExp > 0 ? oldExp : DEFAULT_EXPIRATION );
purgeMessage(messageSend);
super.send(producerExchange, messageSend);
}
class="com.alibaba.napoli.plugins.MessageControlBrokerPlugin">
</bean>
璋冭瘯浠g爜鍙戠幇錛?/p>
鍦ˋctivemq鐨剆end response澶勭悊涓紝浣跨敤浜嗕竴涓狟lockingQueue錛屽湪鏈塼imeout鐨勬柟娉曢噷錛屼嬌鐢ㄤ簡poll鏂規(guī)硶錛岃繖涓柟娉曠殑api璇存槑涓寚鍑猴紝褰搕imeout鍙戠敓鏃訛紝榪欎釜鏂規(guī)硶榪斿洖null錛侊紒錛?/p>
鎴戜滑鍦ㄧ湅AMQ緇忚繃灞傚眰璋冪敤鍚庯紝鍦ˋctiveMQConnection鏂規(guī)硶涓浣曞鐞嗚繖涓繑鍥炲鹼細(xì)
瀵硅繑鍥炲間負(fù)絀虹殑鎯呭喌娌℃湁鍋氫換浣曞鐞嗭紝鍗充嬌娑堟伅鍙戦佽秴鏃訛紝amq涔熻涓鴻繖涓秷鎭彂閫佹垚鍔燂紒浼拌榪欏摜浠悊瑙oll鍦╰imeout鐨勬椂鍊欎細(xì)鎶涘嚭寮傚父鍚с?/p>
瑙e喅鍔炴硶寰堢畝鍗曪紝鍦╮esponse涓虹┖鐨勬椂鍊欙紝鎶涘嚭JMSException錛屽憡鐭ュ彂鐢烼imeout閿欒銆?/p>