今回はActiveMQを使う場合の
MessageQueueの管理についてのメモ.
もちろん,付属のWebConsoleとか,
JDKに付属のjconsoleでチョチョイ
っていうのもありなんだけどね.
でも,自分のプログラムから制御したい
って時にはJMXでアクセスすればOK.
手順は以下の通り.
- ブローカのJMXを有効化する
- JVMのJMX接続ポートを有効化する
- JMXアクセスのクライアントとして
JMXポートに接続する - ブローカMBeanを取得する
- MBeanの操作を行う
まず,ActiveMQのブローカのJMXを有効にする.
設定ファイル(例えば,[ACTIVEMQ_HOME]/conf/activemq.xml)
のbrokerのuseJmxを設定する.
<broker useJmx="true" .... >
更に,managementContextのcreateConnectorを
設定する.
<mamangementContext createConnector="true" />
これで,MQのブローカの設定は完了.
次に,JMXポートの有効化には,ActvieMQの起動時に
次のシステムプロパティを設定する.
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
この辺の詳細はJMXの解説を見ればOK.
この設定は認証なしなので,必要に応じて
認証ありの設定をすることも可能.
ちなみにActiveMQの起動はバッチファイルなら
"SUNJMX"変数で,サービスならwrapper.confの
"wrapper.java.additional"で設定する.
ここでやっとJMXクライアントの作成.
Clientクラス:
public class Client {
public static void main(String[] args) throws Exception {
ApplicationContext context =
new ClassPathXmlApplicationContext(
"classpath:activemq-jmx-context.xml");
ActivemqQueueManager manager =
conntext.getBean(ActivemqQueueManager.class);
BrokerViewMBean broker = manager.getBrokerMBean();
// 何か操作
}
}
ActivemqQueueManagerクラス:
@Component("queueManager")
public class ActivemqQueueManager {
@Autowired(required = true)
private MBeanServerConnection mbsConnection;
@Value("${jmx.amq.domain.name}")
private String domainName;
@Value("${jmx.amq.broker.name}")
private String brokerName;
// ブローカの取得
public BrokerViewMBean getBrokerMBean()
throws MalformedObjectNameException, NullPointerException {
Hashtable<String, String> params = new Hashtable<String, String>();
params.put("BrokerName", brokerName);
params.put("Type", "Broker");
return (BrokerViewMBean) MBeanServerInvocationHandler
.newProxyInstance(
mbsConnection,
new ObjectName(domainName, params),
BrokerViewMBean.class,
true);
}
// 名前でキューの取得
public QueueViewMBean getQueueMBean(String queueName)
throws MalformedObjectNameException, NullPointerException {
Hashtable<String, String> params = new Hashtable<String, String>();
params.put("BrokerName", brokerName);
params.put("Type", "Queue");
params.put("QueueName", queueName);
return (QueueViewMBean) MBeanServerInvocationHandler
.newProxyInstance(
mbsConnection,
new ObjectName(domainName, params),
QueueViewMBean.class,
true);
}
}
Spring Context(JMXのみ):
<bean id="jmxUrl" class="javax.management.remote.JMXServiceURL">
<constructor-arg
value="service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"/>
</bean>
<bean id="jmxConnector"
class="javax.management.remote.JMXConnectorFactory"
factory-method="connect" >
<constructor-arg ref="jmxUrl"/>
</bean>
<bean id="mbeanServerConnection" factory-bean="jmxConnector"
factory-method="getMBeanServerConnection"/>
色々な設定自体は面倒だけど,とっても簡単だね.
ちなみにSpring ContextのJMX部分は
ホスト名とポートをプロパティで外に出せば
汎用的に使えるはず.