java.lang.ClassCastException: org.hornetq.jms.client.HornetQMessage cannot be cast to javax.jms.TextMessage
chintan_jboss Apr 19, 2017 10:57 AMHi,
Below configuration receives message from _request queue and process it and send it to notification queue (_response). There is standalone Java listener running which listens on that queue. But when message arrives, it is throwing ClassCastException. Here is Switchyard configuration and route.xml
<?xml version="1.0" encoding="UTF-8"?> <switchyard xmlns="urn:switchyard-config:switchyard:1.0" xmlns:swyd="urn:switchyard-config:switchyard:1.0" xmlns:camel="urn:switchyard-component-camel:config:1.0" xmlns:jms="urn:switchyard-component-camel-jms:config:1.0" xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912"> <sca:composite name="helloworld_action" targetNamespace="urn:switchyard-quickstart:helloworld_action:0.1.0"> <sca:service name="SimpleListener" promote="HelloWorld_ActionESB/SimpleListener"> <jms:binding.jms> <jms:queue>hpoes_data_service_request</jms:queue> <jms:connectionFactory>#ConnectionFactory</jms:connectionFactory> </jms:binding.jms> </sca:service> <sca:component name="HelloWorld_ActionESB"> <camel:implementation.camel> <camel:xml path="META-INF/route.xml"/> </camel:implementation.camel> <sca:service name="SimpleListener"> <interface.esb inputType="java:org.apache.camel.Message" outputType="java:org.apache.camel.Message"/> </sca:service> <sca:reference name="notificationAction"> <interface.esb inputType="java:java.lang.String"/> </sca:reference> <sca:property value="spring_context.xml" name="springContextXML"/> </sca:component> <sca:reference name="notificationAction" multiplicity="1..1" promote="HelloWorld_ActionESB/notificationAction"> <jms:binding.jms> <jms:queue>hpoes_data_service_response</jms:queue> <jms:connectionFactory>#ConnectionFactory</jms:connectionFactory> <jms:disableReplyTo>true</jms:disableReplyTo> </jms:binding.jms> </sca:reference> </sca:composite> <domain> <properties> <property name="org.switchyard.handlers.messageTrace.enabled" value="true"/> </properties> </domain> </switchyard>
route.xml
<?xml version="1.0" encoding="UTF-8"?> <route xmlns="http://camel.apache.org/schema/spring" id="org.switchyard.quickstarts.helloworld.action.SimpleListener" errorHandlerRef="loggingErrorHandler"> <from uri="switchyard://SimpleListener" /> <log message="[message] '${body}'" /> <to uri="bean:genericServiceInvokerAction?method=executeAction" /> <setHeader headerName="CamelJmsMessageType"> <constant>JmsMessageType.Text</constant> </setHeader> <to uri="switchyard://notificationAction" /> <camelContext xmlns="http://camel.apache.org/schema/spring"/></route>
Service bean (genericServiceInvokerAction)
public Message executeAction(Message message) throws Exception { JmsMessage jmsMessage = message.getBody(JmsMessage.class); HashMap<String, Serializable> map = jmsMessage.getBody(HashMap.class); try { // process message from map and create json result String splitJsonResult = jsonResult; message.setBody(splitJsonResult); message.getExchange().getProperties().put(Constants.SERVICE_REPLY_CLASS_FIELD, } catch (Throwable ex) { logger.error("Error", ex); String jsonResult = ex.toString(); if (ex instanceof InvocationTargetException) { ex = ((InvocationTargetException) ex).getTargetException(); jsonResult = ex.getMessage() == null ? "" : ex.getMessage(); if (ex instanceof RuntimeException) { ex = new RuntimeException(); } } message.setBody(jsonResult); message.getExchange().getProperties().put(Constants.SERVICE_REPLY_CLASS_FIELD, ex.getClass().getName()); } return message; }
Java listener which is listens on queue: hpoes_data_service_response
private TextMessage processResponseMessage(QueueSession session, InitialContext initialContext, String correlationId) throws JMSException, NamingException, ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, Exception { TextMessage replyMessage; logger.debug("Waiting for message w/ id " + correlationId); MessageConsumer consumer = session.createConsumer((Destination)initialContext.lookup("jms/hpoes_data_service_response")); replyMessage = (TextMessage) consumer.receive(); //fails here which ClassCastException logger.debug("Got message w/ id " + correlationId); replyMessage.acknowledge(); consumer.close(); String clazz = replyMessage.getStringProperty(Constants.SERVICE_REPLY_CLASS_FIELD); if ("boolean".equals(clazz)) clazz = "java.lang.Boolean"; if ("int".equals(clazz)) clazz = "java.lang.Integer"; // exception ? if (Exception.class.isAssignableFrom(Class.forName(clazz))) { @SuppressWarnings("unchecked") Class<Exception> ex = (Class<Exception>) Class.forName(clazz); Constructor<Exception> co = (Constructor<Exception>) ex. getConstructor(String.class); Exception e = co.newInstance("Service Error. Message was: " + replyMessage.getText()); throw e; } return replyMessage; }
can someone help me to find solution?
thanks
Chintan