HornetQ用のJBossTSリカバリ設定
そういやHornetQ用のXAResourceRecoveryってどれだ・・・
[ore@ore hornetq-2.0.0.GA-src]$ grep -r "implements XAResourceRecovery" src/* src/main/org/hornetq/jms/server/recovery/HornetQXAResourceRecovery.java:public class HornetQXAResourceRecovery implements XAResourceRecovery
あった。
てことはPGも合わせて、jbossts-properties.xmlはこんなもんでいいのかな
--- jbossts-properties.xml.orig 2010-04-11 20:15:12.996671300 +0900 +++ jbossts-properties.xml 2010-04-11 20:11:52.067917700 +0900 @@ -226,6 +226,11 @@ name="com.arjuna.ats.txoj.lockstore.allowNestedLocking" value="YES"/> </properties> <properties depends="arjuna" name="jta"> + <property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.PG1" + value= "com.arjuna.ats.internal.jbossatx.jta.AppServerJDBCXARecovery;PostgresDS"/> + <property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.HQ1" + value="org.hornetq.jms.server.recovery.HornetQXAResourceRecovery;java:/DefaultJMSProvider"/> + <property name="com.arjuna.ats.jta.xaRecoveryNode" value="1"/> <!-- Support subtransactions in the JTA layer? Default is NO.
あかん。AppServerJDBCXARecoveryがJMXの認証できてない。確か以前はそもそも認証に非対応だったな・・・
20:34:45,896 ERROR [AppServerJDBCXARecovery] AppServerJDBCXARecovery.createDataSource got exception java.lang.SecurityException: Failed to authenticate principal=null, securityDomain=jmx-console java.lang.SecurityException: Failed to authenticate principal=null, securityDomain=jmx-console ...
おおっ。AppServerJDBCXARecoveryが認証サポートしたことになっている。
[#JBTM-432] Authentication support on AppServerJDBCXARecovery plugin - JBoss Issue Tracker
https://jira.jboss.org/jira/secure/attachment/12325434/JBTM-432.patch
こうかな
<property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.PG1" value= "com.arjuna.ats.internal.jbossatx.jta.AppServerJDBCXARecovery;jndiName=PostgresDS,username=admin,password=admin"/>
今度こそ・・・て今度はHornetQかい
2010-04-11 20:23:54,111 ERROR [org.hornetq.jms.server.recovery.HornetQXAResourceWrapper] (Thread-10) ********************************Failed to connect to server HornetQException[errorCode=0 message=Failed to initialise session factory] ... Caused by: java.lang.IllegalArgumentException: Error instantiating connector factory "java:/DefaultJMSProvider" at org.hornetq.core.client.impl.FailoverManagerImpl.instantiateConnectorFactory(FailoverManagerImpl.java:1015) at org.hornetq.core.client.impl.FailoverManagerImpl.<init>(FailoverManagerImpl.java:227) at org.hornetq.core.client.impl.ClientSessionFactoryImpl.initialise(ClientSessionFactoryImpl.java:237) at org.hornetq.core.client.impl.ClientSessionFactoryImpl.createSessionInternal(ClientSessionFactoryImpl.java:1039) ... 19 more Caused by: java.lang.ClassNotFoundException: java:/DefaultJMSProvider from gerogerogerogero...
いやいや、クラス名じゃなくてJNDI名なんですけど・・・どうもJBMのXAResourceRecoveryとは仕様が違うらしい。
hornetq-2.0.0.GA/examples/javaee/xarecovery/server/jbossts-properties.xmlを発見!
<property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.HORNETQ1" value="org.hornetq.jms.server.recovery.HornetQXAResourceRecovery;org.hornetq.core.remoting.impl.invm.InVMConnectorFactory"/>
したけどInVMだなぁ。リモートはどうしたらいいんだ・・・?
近くのパッケージを探しても InVMConnectorFactory と同じく ConnectorFactory を実装しているクラスが見つからない。
しょうがないので、よっこらしょ・・・てな感じでgrep
[ore@ore hornetq-2.0.0.GA-src]$ grep -r "implements ConnectorFactory" src/* src/main/org/hornetq/core/remoting/impl/invm/InVMConnectorFactory.java:public class InVMConnectorFactory implements ConnectorFactory src/main/org/hornetq/integration/transports/netty/NettyConnectorFactory.java:public class NettyConnectorFactory implements ConnectorFactory
いたいた。てことはこれでいいのかしら
<property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.HQ1" value="org.hornetq.jms.server.recovery.HornetQXAResourceRecovery;org.hornetq.integration.transports.netty.NettyConnectorFactory"/>
うむ・・・エラーは出なくなった、けど。ConnectorFactoryってのが何だかわからんな。TMとHornetQが同居しててXA切る場合はInVMConnectorFactoryが使えるようだけど、別居の場合はこれだけじゃだめだよなぁ。 NettyConnectorFactoryを指定するのはいいとして、接続先のIPとかどこで指定するんだろう・・・
とりあえずこの辺を読んでみたところ
- org.hornetq.jms.server.recovery.HornetQXAResourceRecovery
- org.hornetq.jms.server.recovery.HornetQXAResourceWrapper
- org.hornetq.api.core.TransportConfiguration
HornetQXAResourceRecoveryのパラメータに ConnectorFactoryName,username,password,host=localhost,port=5445 的な書き方ができそうな気がする。
試しに、間違ったポートを指定してみよう。正しくは5445。
<property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.HQ1" value="org.hornetq.jms.server.recovery.HornetQXAResourceRecovery;org.hornetq.integration.transports.netty.NettyConnectorFactory,,,host=localhost,port=15445"/>
うむ。ちゃんと読まれているようだ。
22:01:50,418 WARN [loggerI18N] [com.arjuna.ats.internal.jta.recovery.xarecovery 1] Local XARecoveryModule.xaRecovery got XA exception javax.transaction.xa.XAEx ception: Error trying to connect to provider org.hornetq.integration.transports. netty.NettyConnectorFactory, XAException.XAER_RMERR 22:01:51,463 ERROR [HornetQXAResourceWrapper] ********************************Fa iled to connect to server HornetQException[errorCode=2 message=Unable to connect to server using configura tion org-hornetq-integration-transports-netty-NettyConnectorFactory?port=15445&h ost=localhost]
んではポートを5445に直して先に進むとしよう。。。結局のところ設定はこんな感じ。あー、いらんところではまった。
--- jbossts-properties.xml.orig 2010-04-11 20:15:12.996671300 +0900 +++ jbossts-properties.xml 2010-04-11 20:11:52.067917700 +0900 @@ -226,6 +226,11 @@ name="com.arjuna.ats.txoj.lockstore.allowNestedLocking" value="YES"/> </properties> <properties depends="arjuna" name="jta"> + <property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.PG1" + value= "com.arjuna.ats.internal.jbossatx.jta.AppServerJDBCXARecovery;jndiName=PostgresDS,username=admin,password=admin"/> + <property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.HQ1" + value="org.hornetq.jms.server.recovery.HornetQXAResourceRecovery;org.hornetq.integration.transports.netty.NettyConnectorFactory,,,host=localhost,port=5445"/> + <property name="com.arjuna.ats.jta.xaRecoveryNode" value="1"/> <!-- Support subtransactions in the JTA layer? Default is NO.
[HornetQ] JMX経由でQueueを作ったりメッセージ全消去したり
なんかあれこれやってたらうまくいった。うーん。
Queueを作る
//...(ry import javax.management.*; import org.hornetq.api.core.management.ObjectNameBuilder; import org.hornetq.api.jms.management.*; import org.jboss.mx.util.MBeanServerLocator; //...(ry MBeanServer server = MBeanServerLocator.locateJBoss(); ObjectName on = ObjectNameBuilder.DEFAULT.getJMSServerObjectName(); JMSServerControl serverControl = (JMSServerControl) MBeanServerInvocationHandler .newProxyInstance( server, on, JMSServerControl.class, false); serverControl.createQueue("hogeQueue", "/queue/hogeQueue");
あるQueueのメッセージを全削除する
removeMessages()の引数にselectorの構文でクエリを指定すれば、一部削除もできるらしい。指定がなければ全削除の模様。
//...(ry import javax.management.*; import org.hornetq.api.core.management.ObjectNameBuilder; import org.hornetq.api.jms.management.*; import org.jboss.mx.util.MBeanServerLocator; //...(ry MBeanServer server = MBeanServerLocator.locateJBoss(); ObjectName on = ObjectNameBuilder.DEFAULT.getJMSQueueObjectName("hogeQueue"); JMSQueueControl queueControl = (JMSQueueControl) MBeanServerInvocationHandler .newProxyInstance( server, on, JMSQueueControl.class, false); queueControl.removeMessages("");
JMX remoteを使ってリモートから操作するのはまだうまくいってない。SecurityException で principal=null とか言ってるから、認証情報がちゃんと渡せてないだけっぽい。そのうちやる。