AMQ有開放插件開發接口,今天研究了一下,直接給項目組加了個消息流監控的功能,看起來還是挺好的。
開發步驟是:
1.開發插件jar包
我寫的這個插件主要作用是當有消息被發送的時候,就往日志中記錄一條。不使用amq自帶的logging plugin的主要原因是格式問題,而且我只需要篩選某幾個應用的消息。
注:BrokerFilter這個類中的方法決定了插件能實現的功能,比如連接建立、連接斷開、消息到達、消息過期等等都可以自定義操作。
程序如下
//入口類
package com.cn.amqs;
import org.apache.activemq.broker.Broker;
import org.apache.activemq.broker.BrokerPlugin;
import org.apache.activemq.plugin.StatisticsBrokerPlugin;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class MessageLogPlugin implements BrokerPlugin {
private Log log = LogFactory.getLog(StatisticsBrokerPlugin.class);
public Broker installPlugin(Broker broker) throws Exception {
log.info("install MessageLogPlugin");
return new MessageLog(broker);
}
}
//主要實現功能的類
package com.cn.amqs;
import org.apache.activemq.broker.Broker;
import org.apache.activemq.broker.BrokerFilter;
import org.apache.activemq.broker.ProducerBrokerExchange;
import org.apache.activemq.command.Message;
import org.apache.activemq.plugin.StatisticsBrokerPlugin;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
//BrokerFilter這個類包含了broker的很多操作,可以看看源碼了解一下
public class MessageLog extends BrokerFilter{
private Log log;
public MessageLog(Broker next) {
super(next);
log = LogFactory.getLog(StatisticsBrokerPlugin.class);
log.info("initialize Message Log plugin")
}
@Override
public void send(ProducerBrokerExchange producerExchange, Message messageSend) throws Exception {
//在這里實現篩選
if (messageSend.getProperty("appname")!=null && messageSend.getProperty("misid")!=null){
if (!messageSend.getProperty("appname").equals("OSC")&&!messageSend.getProperty("appname").equals("OSP"))
log.info("[FLOW_LOG] MissionID: "+messageSend.getProperty("misid")+" Destination: "+messageSend.getDestination());
}
super.send(producerExchange, messageSend);
}
}
2.打上面的程序打成jar包后,將jar包放在amq的lib目錄下。
3.修改activemq.xml文件
在activemq.xml文件中的plugins標簽下添加如下的一段代碼
<plugins>
<bean xmlns="http://www.springframework.org/schema/beans" id="MessageLogPlugin" class="com.cn.amqs.MessageLogPlugin">
</plugins>
4.重啟MQ,消息流的日志就會顯示在data目錄下的activemq.log中了