2 Replies Latest reply on Nov 15, 2011 1:16 AM by amyboss

    JMS durable subscriber problem

    twolak

      Hi:

      This is driving me crazy.  I don't seem to be alble to setup jboss 5 to use durable JMS. 

      My setup is typical (followed Jboss in Action) and here are the highlighgts

       

      messaging-jboss-beans.xml

      <bean name="SecurityStore" class="org.jboss.jms.server.jbosssx.JBossASSecurityMetadataStore">

            <!-- default security configuration -->

            <property name="defaultSecurityConfig">

               <![CDATA[

                  <security>

                     <role name="guest" read="true" write="true" create="true"/>

                  </security>

               ]]>

            </property>

            <property name="suckerPassword">CHANGE ME!!</property>

            <property name="securityDomain">JMSRealm</property>

            <property name="securityManagement"><inject bean="JNDIBasedSecurityManagement"/></property>

            <!-- @JMX annotation to export the management view of this bean -->

            <annotation>@org.jboss.aop.microcontainer.aspects.jmx.JMX(name="jboss.messaging:service=SecurityStore",exposedInterface=org.jboss.jms.server.jbosssx.JBossASSecurityMetadataStoreMBean.class)</annotation>

            <!-- Password Annotation to inject the password from the common password utility

             <annotation>@org.jboss.security.integration.password.Password(securityDomain="messaging",methodName="setSuckerPassword")</annotation>

             -->

         </bean>

       

      Destinations-service.xml

       

         <mbean code="org.jboss.jms.server.destination.TopicService"
               name="jbia.jms:service=Topic,name=secureTopic"
               xmbean-dd="xmdesc/Topic-xmbean.xml">
      
      
          <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
          <depends>jboss.messaging:service=PostOffice</depends>
          <attribute name="SecurityConfig">
            <security>        
              <role name="publisher" read="true" create="true" />
            </security>
          </attribute>
        </mbean>
      
      

      login-config.xml

       

       <application-policy name="JMSRealm">
          <authentication>
           <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
             <module-option name="dsJndiName">java:/MySqlDS</module-option>
             <module-option name="principalsQuery">
               SELECT passwd from jbm_user WHERE user_id=?
              </module-option>
              <module-option name="rolesQuery">
                        SELECT role_id,'Roles' FROM jbm_role WHERE user_id=?
              </module-option>
            </login-module>
          </authentication>
        </application-policy>
      
      

      I am using MySql and datasource has been defined.  On startup the jms tables have been created.  The table have valid data

      Now when I try to run a simple jms subscriber:

       

      public class DurableTopicRecvClient {
                TopicConnection conn = null;
                TopicSession session = null;
                Topic topic = null;
      
      
                public void setupPubSub() throws JMSException, NamingException {
                          Context iniCtx = getInitialContext();
                          Object tmp = iniCtx.lookup("ConnectionFactory");
      
      
                          TopicConnectionFactory tcf = (TopicConnectionFactory) tmp;
                          conn = tcf.createTopicConnection("dynsub", "dynsub");
                          topic = (Topic) iniCtx.lookup("topic/secureTopic");
      
      
                          session = conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
                          conn.start();
                }
      
      
                public void recvSync() throws JMSException, NamingException {
                          System.out.println("Begin recvSync");
                          // Setup the pub/sub connection, session
                          setupPubSub();
                          // Wait upto 5 seconds for the message
                          TopicSubscriber recv = session.createDurableSubscriber(topic,
                                              "chap6-ex1dtps");
                          Message msg = recv.receive(5000);
                          if (msg == null) {
                                    System.out.println("Timed out waiting for msg");
                          } else {
                                    System.out.println("DurableTopicRecvClient.recv, msgt=" + msg);
                          }
                }
      
      
                public void stop() throws JMSException {
                          conn.stop();
                          session.close();
                          conn.close();
                }
      
      
                public static void main(String args[]) throws Exception {
                          System.out.println("Begin DurableTopicRecvClient, now="
                                              + System.currentTimeMillis());
                          DurableTopicRecvClient client = new DurableTopicRecvClient();
                          client.recvSync();
                          client.stop();
                          System.out.println("End DurableTopicRecvClient");
                          System.exit(0);
                }
      
      
                public static Context getInitialContext()
                                    throws javax.naming.NamingException {
                          Properties p = new Properties();
                          p.put(Context.INITIAL_CONTEXT_FACTORY,
                                              "org.jnp.interfaces.NamingContextFactory");
                          p.put(Context.URL_PKG_PREFIXES, " org.jboss.naming:org.jnp.interfaces");
                          p.put(Context.PROVIDER_URL, "jnp://localhost:1099");
                          return new javax.naming.InitialContext(p);
                }
      }
      
      

      I get this: in the clients log

       

      Exception in thread "main" javax.jms.JMSSecurityException: User: dynsub is not authorized to create durable sub on destination secureTopic
                at org.jboss.jms.server.container.SecurityAspect.check(SecurityAspect.java:312)
                at org.jboss.jms.server.container.SecurityAspect.handleCreateConsumerDelegate(SecurityAspect.java:120)
                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
                at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
                at java.lang.reflect.Method.invoke(Unknown Source)
                at org.jboss.aop.advice.PerInstanceAdvice.invoke(PerInstanceAdvice.java:122)
                at org.jboss.jms.server.endpoint.advised.SessionAdvised$createConsumerDelegate_8721389917985689973.invokeNext(SessionAdvised$createConsumerDelegate_8721389917985689973.java)
                at org.jboss.jms.server.container.ServerLogInterceptor.invoke(ServerLogInterceptor.java:105)
                at org.jboss.jms.server.endpoint.advised.SessionAdvised$createConsumerDelegate_8721389917985689973.invokeNext(SessionAdvised$createConsumerDelegate_8721389917985689973.java)
                at org.jboss.jms.server.endpoint.advised.SessionAdvised.createConsumerDelegate(SessionAdvised.java)
                at org.jboss.jms.wireformat.SessionCreateConsumerDelegateRequest.serverInvoke(SessionCreateConsumerDelegateRequest.java:100)
                at org.jboss.jms.server.remoting.JMSServerInvocationHandler.invoke(JMSServerInvocationHandler.java:157)
                at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:897)
                at org.jboss.remoting.transport.socket.ServerThread.completeInvocation(ServerThread.java:768)
                at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:721)
                at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:575)
                at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:234)
                at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:213)
                at org.jboss.remoting.Client.invoke(Client.java:1917)
                at org.jboss.remoting.Client.invoke(Client.java:768)
                at org.jboss.remoting.Client.invoke(Client.java:756)
                at org.jboss.jms.client.delegate.DelegateSupport.doInvoke(DelegateSupport.java:189)
                at org.jboss.jms.client.delegate.DelegateSupport.doInvoke(DelegateSupport.java:160)
                at org.jboss.jms.client.delegate.ClientSessionDelegate.org$jboss$jms$client$delegate$ClientSessionDelegate$createConsumerDelegate$aop(ClientSessionDelegate.java:267)
                at org.jboss.jms.client.delegate.ClientSessionDelegate$createConsumerDelegate_8721389917985689973.invokeNext(ClientSessionDelegate$createConsumerDelegate_8721389917985689973.java)
                at org.jboss.jms.client.container.StateCreationAspect.handleCreateConsumerDelegate(StateCreationAspect.java:136)
                at org.jboss.aop.advice.org.jboss.jms.client.container.StateCreationAspect_z_handleCreateConsumerDelegate_1835992178.invoke(StateCreationAspect_z_handleCreateConsumerDelegate_1835992178.java)
                at org.jboss.jms.client.delegate.ClientSessionDelegate$createConsumerDelegate_8721389917985689973.invokeNext(ClientSessionDelegate$createConsumerDelegate_8721389917985689973.java)
                at org.jboss.jms.client.container.ConsumerAspect.handleCreateConsumerDelegate(ConsumerAspect.java:76)
                at org.jboss.aop.advice.org.jboss.jms.client.container.ConsumerAspect_z_handleCreateConsumerDelegate_1835992178.invoke(ConsumerAspect_z_handleCreateConsumerDelegate_1835992178.java)
                at org.jboss.jms.client.delegate.ClientSessionDelegate$createConsumerDelegate_8721389917985689973.invokeNext(ClientSessionDelegate$createConsumerDelegate_8721389917985689973.java)
                at org.jboss.jms.client.container.FailoverValveInterceptor.invoke(FailoverValveInterceptor.java:92)
                at org.jboss.aop.advice.PerInstanceInterceptor.invoke(PerInstanceInterceptor.java:86)
                at org.jboss.jms.client.delegate.ClientSessionDelegate$createConsumerDelegate_8721389917985689973.invokeNext(ClientSessionDelegate$createConsumerDelegate_8721389917985689973.java)
                at org.jboss.jms.client.container.ClosedInterceptor.invoke(ClosedInterceptor.java:170)
                at org.jboss.aop.advice.PerInstanceInterceptor.invoke(PerInstanceInterceptor.java:86)
                at org.jboss.jms.client.delegate.ClientSessionDelegate$createConsumerDelegate_8721389917985689973.invokeNext(ClientSessionDelegate$createConsumerDelegate_8721389917985689973.java)
                at org.jboss.jms.client.delegate.ClientSessionDelegate.createConsumerDelegate(ClientSessionDelegate.java)
                at org.jboss.jms.client.JBossSession.createDurableSubscriber(JBossSession.java:279)
                at com.tomek.jms.topic.DurableTopicRecvClient.recvSync(DurableTopicRecvClient.java:50)
                at com.tomek.jms.topic.DurableTopicRecvClient.main(DurableTopicRecvClient.java:70)
      
      

      I tried this for half a day and I am not getting anywehre.  Abviously I am missing something trivial and I am hoping that a second set of eyes might spot the problem. 

       

      Additional files are attached.

       

      Thanks for your help.

        • 1. Re: JMS durable subscriber problem
          twolak

          I fixed this.  Helps to step away from a problem for few hours

          Two issues. First destinations-services where the topic is defined another privliage needs to be added "create" this one allows you to create durable subscribers.

           

          <mbean code="org.jboss.jms.server.destination.TopicService"
                   name="jbia.jms:service=Topic,name=secureTopic"
                   xmbean-dd="xmdesc/Topic-xmbean.xml">
          
          
              <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
              <depends>jboss.messaging:service=PostOffice</depends>
              <attribute name="SecurityConfig">
                <security>       
                        <role name="publisher" read="true" write="true" create="true"/>
                </security>
              </attribute>
            </mbean>
          
          

          Second problem is that the creation of durable subscritpion requires a Client id on the connection.  I changed the setupPubSub() method to do just that

           

          public void setupPubSub() throws JMSException, NamingException {
                              Context iniCtx = getInitialContext();
                              Object tmp = iniCtx.lookup("ConnectionFactory");
          
          
                              TopicConnectionFactory tcf = (TopicConnectionFactory) tmp;
            
                              conn = tcf.createTopicConnection("dynsub","dynsub");
                              conn.setClientID("myId");
                        topic = (Topic) iniCtx.lookup("topic/secureTopic"); 
                        session = conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
                              conn.start();
            
                    }
          
          

          Hoe this helps someone else.

          Cheers

          Tomasz

          • 2. Re: JMS durable subscriber problem
            amyboss

            thanks!!!