4 Replies Latest reply on Dec 7, 2011 12:59 PM by Tom Cunningham

    JMSRouter Topic bug

    Jason Adam Newbie

      I've read in several developer posts about the bug that the old 4.7 release had with casting messages to Queues (not supporting Topics).  Does 4.8 support this?  Quite frankly I don't understand all the release information in some of the posts so I'm not sure which release has the fix to support both queues and topics.  I need to put in a request for evaluation at work and want to make sure I get the right version.  4.7 was approved for use, and unfortunately with the amount of process we have here, the closer to the originally approved version the better (unless going from 4.7 to 4.10 isn't that big of a jump and includes better security, that sort of thing).

       

      Thanks for any insight you can provide

      Jason

        • 1. Re: JMSRouter Topic bug
          Tom Cunningham Master

          Jason,

           

          That looks like https://issues.jboss.org/browse/JBESB-3288

           

          It looks like 4.8 is the minimal release with this fix, but in this sort of situation you're really better off if you go and back test the old releases to make sure they do what you want.      You could start at 4.8 and then go to 4.9 or 4.10 if you have issues.

          • 2. Re: JMSRouter Topic bug
            Jason Adam Newbie

            Yup that's the bug tracker post I found earlier.  Thanks for the info! Hopefully I can get them to agree on 4.8 in a reasonable amount of time.

             

            Thanks for the response!

            Jason

            • 3. Re: JMSRouter Topic bug
              Jason Adam Newbie

              So I got my hands on 4.9, but I'm still seeing the following exception on startup of the ESB:

               

              Caused by: java.lang.ClassCastException: org.hornetq.jms.client.HornetQTopic cannot be cast to javax.jms.Queue
              at org.jboss.soa.esb.actions.routing.JMSRouter.createQueueSetup(JMSRouter.java:490)

               

              Here is my jboss-esb.xml definition:

               

              <?xml version = "1.0" encoding = "UTF-8"?>
              <jbossesb
              xmlns="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd"
              parameterReloadSecs="5">

              <providers>

                <jms-provider name="Provider1" connection-factory="ConnectionFactory"
                 jndi-URL="jnp://machineXXX:1099" jndi-context-factory="org.jnp.interfaces.NamingContextFactory">

                 <jms-bus busid="dasValidationIn">
                  <jms-message-filter dest-type="TOPIC"
                   dest-name="/topic/samm.schedule.response" />
                 </jms-bus>
                </jms-provider>
               
                <jms-provider name="Provider2" connection-factory="ConnectionFactory"
                 jndi-URL="jnp://machineXXX:1099" jndi-context-factory="org.jnp.interfaces.NamingContextFactory">

                 <jms-bus busid="mmValidationIn">
                  <jms-message-filter dest-type="TOPIC"
                   dest-name="/topic/ValidateSchedule" />
                 </jms-bus>
                 <jms-bus busid="mmScheduleIn">
                  <jms-message-filter dest-type="TOPIC"
                   dest-name="/topic/ScheduleDistribution" />
                 </jms-bus>
                </jms-provider>
                
                <!-- Internal JMS Topics -->
                <jms-provider name="InVmJBossMQ" connection-factory="ConnectionFactory">
                 <jms-bus busid="nativeValidationIn">
                  <jms-message-filter dest-type="TOPIC"
                   dest-name="/topic/nativeValidationIn" />
                 </jms-bus>
                 <jms-bus busid="nativeValidationRouterIn">
                  <jms-message-filter dest-type="TOPIC"
                   dest-name="/topic/nativeValidationRouterIn" />
                 </jms-bus>
                 <jms-bus busid="nativeScheduleIn">
                  <jms-message-filter dest-type="TOPIC"
                   dest-name="/topic/nativeScheduleIn" />
                 </jms-bus>
                 <jms-bus busid="internalScheduleIn">
                  <jms-message-filter dest-type="TOPIC"
                   dest-name="/topic/internalScheduleIn" />
                 </jms-bus>
                 <jms-bus busid="dasValidationOut">
                  <jms-message-filter dest-type="TOPIC"
                   dest-name="/topic/dasValidationOut" />
                 </jms-bus>
                 <jms-bus busid="dasScheduleOut">
                  <jms-message-filter dest-type="TOPIC"
                   dest-name="/topic/dasSceduleOut" />
                 </jms-bus>
                </jms-provider>
              </providers>

               

              <!--
                Router services defined. These check the type of schedule being
                received, using XPath, to determine where the schedule should go.
                There is one router service defined for validation the schedule, and a
                separate one for publishing good schedules.
              -->

              <services>
                   <!-- Routes a test schedule to the correct subsystem for validation -->
                <service category="ValidationRouter" name="ScheduleValidationRouter"
                 description="Content Based Schedule Validation Router">
                 <listeners>
                  <jms-listener name="NativeRouterListener" busidref="nativeValidationRouterIn" />
                 </listeners>
                 <actions mep="OneWay">
                  <action name="ContentBasedRouter" class="org.jboss.soa.esb.actions.ContentBasedRouter">
                   <property name="cbrAlias" value="XPath" />
                   <property name="destinations">
                    <route-to service-category="DASValidation" service-name="DASValidationService"
                     expression="/schedule[@type='DAS']" />
                   </property>
                  </action>

                 </actions>
                </service>
               
                <service category="InternalValidation" name="InternalScheduleValidator"
                 description="Internal Schedule Validation Service">
                 <listeners>
                  <jms-listener name="JMS-Gateway" busidref="mmValidationIn"
                   is-gateway="true" />
                  <jms-listener name="NativeListener" busidref="nativeValidationIn" />
                 </listeners>
                 <actions mep="OneWay">
                  <action name="InternalValidator" class="com.rsc.esb.actions.ValidatorAction"
                   process="validateSchedule" />
                  <action name="routeAction" class="org.jboss.soa.esb.actions.StaticRouter">
                   <property name="destinations">
                    <route-to service-category="InternalValidationResponse"
                     service-name="InternalValidationResponseService" />
                   </property>
                  </action>
                 </actions>
                </service>
               
                <!-- Routes good schedules to the appropriate subsystem. -->
                <service category="ScheduleRouter" name="ScheduleRouter"
                 description="Content Based Schedule Router">
                 <listeners>
                  <jms-listener name="NativeScheduleListener" busidref="nativeScheduleIn" />
                 </listeners>
                 <actions mep="OneWay">
                  <action name="ContentBasedRouter" class="org.jboss.soa.esb.actions.ContentBasedRouter">
                   <property name="cbrAlias" value="XPath" />
                   <property name="destinations">
                    <route-to service-category="DASSchedules" service-name="DASScheduleService"
                     expression="/schedule[@type='DAS']" />
                   </property>
                  </action>
                 </actions>
                </service>
               
                <!-- Listens for MM schedules to "distribute".  This will just write the schedule
                     to a file.
                   -->
                <service category="InternalDistribution" name="InternalScheduleDistribution"
                 description="Internal Schedule Distribution Service">
                 <listeners>
                  <jms-listener name="JMS-Gateway" busidref="mmScheduleIn"
                   is-gateway="true" />
                  <jms-listener name="InternalScheduleListener" busidref="internalScheduleIn" />
                 </listeners>
                 <actions mep="OneWay">
                  <action name="writeMessage" class="com.rsc.esb.actions.WriterAction"
                   process="writeMessage">
                   <property name="folder" value="distribution" />
                  </action>
                 </actions>
                </service>

               
                <service category="DASValidation" name="DASValidationService"
                 description="DAS Validation Router">
                 <listeners>
                  <jms-listener name="DASValidationRouterListener"
                   busidref="dasValidationOut" />
                 </listeners>
                 <actions mep="OneWay">
                  <action name="writeMessage" class="com.rsc.esb.actions.WriterAction"
                   process="writeMessage">
                   <property name="folder" value="validation" />
                  </action>
                  <action name="routeToCLG" class="org.jboss.soa.esb.actions.routing.JMSRouter">
                   <property name="jndi-context-factory" value="org.jnp.interfaces.NamingContextFactory" />
                   <property name="jndi-URL" value="jnp://machineXXX:1099" />
                   <property name="jndi-pkg-prefix" value="org.jboss.naming:org.jnp.interfaces" />
                   <property name="connection-factory" value="ConnectionFactory" />
                   <property name="jndiName" value="/topic/samm.schedule.validation" />
                   <property name="unwrap" value="true" />
                   <property name="security-principal" value="guest" />
                   <property name="security-credential" value="guest" />
                  </action>
                 </actions>
                </service>

                <!--
                 Service for receiving validation response from the validator test tool
                 to be sent back to MM
                -->
                <service category="InternalValidationResponse" name="InternalValidationResponseService"
                 description="Responses from Internal Validation Services">
                 <listeners>
                  <jms-listener name="InternalListener" busidref="internalScheduleIn" />
                 </listeners>
                 <actions mep="OneWay">
                  <action name="writeMessage" class="com.rsc.esb.actions.WriterAction"
                   process="writeMessage">
                   <property name="folder" value="validation" />
                  </action>
                  <action name="routeToMM" class="org.jboss.soa.esb.actions.routing.JMSRouter">
                   <property name="jndi-context-factory" value="org.jnp.interfaces.NamingContextFactory" />
                   <property name="jndi-URL" value="jnp://machineXXX:1099" />
                   <property name="jndi-pkg-prefix" value="org.jboss.naming:org.jnp.interfaces" />
                   <property name="connection-factory" value="ConnectionFactory" />
                   <property name="jndiName" value="/topic/ValidateSchedule" />
                   <property name="unwrap" value="true" />
                   <property name="security-principal" value="guest" />
                   <property name="security-credential" value="guest" />
                  </action>
                 </actions>
                </service>
               
                <!-- Receives validation response messages from subsystems and writes the response
                     to a file.
                -->
                <service category="ValidationResponse" name="ValidationResponseService"
                 description="Responses from Validation Services">
                 <listeners>
                  <jms-listener name="JMS-Gateway" busidref="dasValidationIn"
                   is-gateway="true" />
                  <jms-listener name="NativeListener" busidref="nativeScheduleIn" />
                 </listeners>
                 <actions mep="OneWay">
                  <action name="writeMessage" class="com.rsc.esb.actions.WriterAction"
                   process="writeMessage">
                   <property name="folder" value="validation" />
                  </action>
                 </actions>
                </service>

               
                <service category="DASSchedule" name="DASScheduleService"
                 description="DAS Schedule Router">
                 <listeners>
                  <jms-listener name="DASScheduleRouterListener"
                   busidref="dasScheduleOut" />
                 </listeners>
                 <actions mep="OneWay">
                  <action name="writeMessage" class="com.rsc.esb.actions.WriterAction"
                   process="writeMessage">
                   <property name="folder" value="distribution" />
                  </action>
                  <action name="routeToCLG" class="org.jboss.soa.esb.actions.routing.JMSRouter">
                   <property name="jndi-context-factory" value="org.jnp.interfaces.NamingContextFactory" />
                   <property name="jndi-URL" value="jnp://machineXXX:1099" />
                   <property name="jndi-pkg-prefix" value="org.jboss.naming:org.jnp.interfaces" />
                   <property name="connection-factory" value="ConnectionFactory" />
                   <property name="jndiName" value="/topic/samm.schedule.distribution" />
                   <property name="unwrap" value="true" />
                   <property name="security-principal" value="guest" />
                   <property name="security-credential" value="guest" />
                  </action>
                 </actions>
                </service>
              </services>
              </jbossesb>

               

              I've removed a few pieces that weren't applicable or company private, but you get the idea.  If I change any of the remote host topics to queues, the server boots fine.  So it looks like despite using version 4.9, it's still trying to cast things to Queues. 

               

              This is installed a fresh version of the ESB, so I wouldn't think there's any jar collision or anything like that.  It just seems to act like the previous version, as if nothing was fixed. 

               

              Is there another package I need to download that maybe we missed? We just grabbed what was defined as the latest 4.9.

               

              Thanks for any help you can provide.

               

              Jason

               

              • 4. Re: JMSRouter Topic bug
                Tom Cunningham Master

                Can you double check your installation and make sure everything is fresh and that your deployment.properties is pointing where you think it should be pointing?     Are you using an old app server that maybe has 4.8 bits on it?

                 

                Here's what I'm seeing as line 489 in JMSRouter.java :

                 

                jmsDestination = (Destination) oCtx.lookup(destinationName);

                 

                http://anonsvn.jboss.org/repos/labs/labs/jbossesb/tags/JBESB_4_9/product/rosetta/src/org/jboss/soa/esb/actions/routing/JMSRouter.java