Exception in thread
gunterr Nov 29, 2007 11:11 AMHello,
I am using JBoss4.0.3SP1 with Java 1.5.0.0.12 on a Windows 2003 Server. I have created a topic on the server where the clients can subscribe to via http.
I have adapted the jboss-service.xml in deploy/jms/jbossmq-httpil.sar/META-INF as follows:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE server> <server> <mbean code="org.jboss.mq.il.http.HTTPServerILService" name="jboss.mq:service=InvocationLayer,type=HTTP"> <depends optional-attribute-name="Invoker">jboss.mq:service=Invoker</depends> <depends>jboss.web:service=WebServer</depends> <attribute name="ConnectionFactoryJNDIRef">HTTPConnectionFactory</attribute> <attribute name="XAConnectionFactoryJNDIRef">HTTPXAConnectionFactory</attribute> <attribute name="PingPeriod">10000</attribute> <attribute name="TimeOut">60</attribute> <attribute name="RestInterval">0</attribute> </mbean> </server>
In order to detect if a client did not unsubscribe, I have added a ClientMonitorInterceptor in the deploy/jms/jbossmq-service.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- $Id: jbossmq-service.xml,v 1.24.2.1 2005/06/01 05:56:44 starksm Exp $ --> <server> <!-- ==================================================================== --> <!-- JBossMQ --> <!-- ==================================================================== --> <!-- ==================================================================== --> <!-- JBossMQ Interceptor chain configuration --> <!-- ==================================================================== --> <!-- To tune performance, you can have the Invoker skip over the TracingInterceptor --> <!-- and/or the SecurityManager, but then you loose the ability to trace and/or enforce security. --> <mbean code="org.jboss.mq.server.jmx.Invoker" name="jboss.mq:service=Invoker"> <depends optional-attribute-name="NextInterceptor">jboss.mq:service=TracingInterceptor</depends> <depends>jboss:service=Naming</depends> </mbean> <mbean code="org.jboss.mq.server.jmx.InterceptorLoader" name="jboss.mq:service=TracingInterceptor"> <attribute name="InterceptorClass">org.jboss.mq.server.TracingInterceptor</attribute> <depends optional-attribute-name="NextInterceptor">jboss.mq:service=SecurityManager</depends> </mbean> <mbean code="org.jboss.mq.security.SecurityManager" name="jboss.mq:service=SecurityManager"> <attribute name="DefaultSecurityConfig"> <security> <role name="guest" read="true" write="true" create="true"/> </security> </attribute> <attribute name="SecurityDomain">java:/jaas/jbossmq</attribute> <depends optional-attribute-name="NextInterceptor">jboss.mq:service=ClientMonitorInterceptor</depends> </mbean> <!-- | The ClientMonitorInterceptor disconnects clients that have been idle for to long. | This interceptor is not enabled by default since the server might disconnect clients | when the it is under high load. --> <mbean code="org.jboss.mq.server.jmx.ClientMonitorInterceptor" name="jboss.mq:service=ClientMonitorInterceptor"> <attribute name="ClientTimeout">80000</attribute> <depends optional-attribute-name="NextInterceptor">jboss.mq:service=DestinationManager</depends> </mbean> <!-- | The ClientReconnectInterceptor is used to allow a client to connect to the server even | if it's clientID is allready being used by another client. This interceptor will disconnect | the previously connected client to allow the new connection to succeed. This is not enabled | by default since the JMS spec states that the 2nd client connecting to the server with the same | id should get an exception. --> <!-- <mbean code="org.jboss.mq.server.jmx.InterceptorLoader" name="jboss.mq:service=ClientReconnectInterceptor"> <attribute name="InterceptorClass">org.jboss.mq.server.ClientReconnectInterceptor</attribute> <depends optional-attribute-name="NextInterceptor">jboss.mq:service=DestinationManager</depends> </mbean> --> <!-- ==================================================================== --> <!-- System Destinations --> <!-- ==================================================================== --> <!-- Dead Letter Queue --> <mbean code="org.jboss.mq.server.jmx.Queue" name="jboss.mq.destination:service=Queue,name=DLQ"> <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends> <depends optional-attribute-name="SecurityManager">jboss.mq:service=SecurityManager</depends> </mbean> </server>
I tested this succesfully on our developing machine. I let the client crash and after a few seconds, the server noticed this and removed the subscription from the nondurable subscriptions list.
I made the same configuration on the customer's site and it worked well for two days. After that, I found the following exception in our server logs:
2007-11-28 11:23:31,718 INFO STDOUT : Exception in thread "ClientMonitor Service Thread"
2007-11-28 11:23:31,718 INFO STDOUT : java.lang.NullPointerException
2007-11-28 11:23:31,718 INFO STDOUT : at org.jboss.mq.server.ClientMonitorInterceptor.disconnectInactiveClients(ClientMonitorInterceptor.java:55)
2007-11-28 11:23:31,718 INFO STDOUT : at org.jboss.mq.server.jmx.ClientMonitorInterceptor$1.run(ClientMonitorInterceptor.java:64)
2007-11-28 11:23:31,718 INFO STDOUT : at java.lang.Thread.run(Thread.java:595)
After this, inactive subscriptions aren't detected anymore on the server.
I searched the forums, jira bug list, faqs, but couldn't find anything pointing to this particular problem.
thanks in advance for anyone who can answer my question.
Gunter