2016-08-31 8 views
1

Я пытаюсь отправить сообщение в очередь ActiveMQ, но получаю java.lang.ClassCastException: java.util.UUID cannot be cast to java.lang.String. Я пытаюсь найти, как решить эту проблему, но нет реальных ответов в Интернете. Я посылаю его с частным способом, например:ClassCastException при отправке сообщения ActiveMQ с Camel

private void sendToHosts(Map<Object, Object> msg, String[] hosts) 
{ 
    Arrays.stream(hosts) 
     .forEach(host -> { 

      ProducerTemplate template = camelContext.createProducerTemplate(); 

      template.setDefaultEndpointUri("direct:com.example.updatehost." + host); 


      try { 
       template.sendBody(msg); //throwing ClassCastException 
      } 
      catch(Exception e) { 
       e.printStackTrace(); 
      } 

    }); 

где camelContext вводится с помощью пружины, и я знаю, что это работает.

Я знаю, что ActiveMQ настроен правильно, так как единственный способ получить этот метод - получить сообщение из другой очереди, и я пытаюсь передать это сообщение после выполнения некоторых методов выше, но я не изменяю сообщение в любом случае.

В сообщении есть Map<UUID,Object>, в котором мое подозрение относится к основной проблеме. Частичное StackTrace:

java.lang.ClassCastException: java.util.UUID не может быть приведен к java.lang.String на org.apache.activemq.util.MarshallingSupport.marshalPrimitiveMap (MarshallingSupport.java:61) на org.apache.activemq.util.MarshallingSupport.marshalPrimitive (MarshallingSupport.java:151) на org.apache.activemq.util.MarshallingSupport.marshalPrimitiveMap (MarshallingSupport.java:64) на org.apache. activeemq.command.ActiveMQMapMessage.storeContent (ActiveMQMapMessage.java:150) по адресу org.apache.activemq.command.ActiveMQMapMessage.copy (ActiveMQMapMessage.java:121) на org.apache.activemq.command.ActiveMQMapMessage.copy (ActiveMQMapMessage.java:116) на org.apache.activemq.ActiveMQSession Пошлите (ActiveMQSession.java:1773) на org.apache.activemq.ActiveMQMessageProducer.send (ActiveMQMessageProducer.java:289) на org.apache.activemq.ActiveMQMessageProducer.send (ActiveMQMessageProducer.java:224) в org.apache.activemq.pool.PooledProducer.send (PooledProducer.java:79) по адресу org.apache.activemq.pool.PooledProducer.send (PooledProducer.java:62) по адресу org.springframework.jms.core.JmsTemplate.doSend (JmsTemplate.java:635) на org.apache.camel.component.jms.JmsConfiguration $ CamelJmsTemplate.doSend (JmsConfiguration.java:343)

Кто-нибудь столкнулся с этим, а затем нашел способ обойти ClassCastException? Мне показалось странным, что при сортировке, они ожидают, что это будет Map<String,Object> и не поддерживают Map<Object,Object>.

I 100% нуждается в Map<UUID,Object> в сообщении, а также, не хочет, чтобы преобразовать UUID к String представление, как я делаю некоторые вещи с Hibernate, который требует, чтобы это было UUID позже вниз по дороге.

ответ

3

Более подробную информацию можно найти здесь: http://camel.apache.org/jms или здесь http://docs.oracle.com/javaee/7/api/javax/jms/Message.html

органы Сообщение

JMS API определяет пять типов тела сообщения:

  • поток - объект StreamMessage-х тело сообщения содержит поток примитивных значений на языке программирования Java («Java
    примитивов "). Он заполняется и читается последовательно.
  • Карта - Тело сообщения Объект MapMessage содержит набор пар имя-значение, где имена String объекты и значения Java примитивы. Записи могут быть доступны последовательно или случайным образом по имени. Порядок записей не определен.

  • Текст - Тело сообщения объекта TextMessage содержит объект java.lang.String. Этот тип сообщения можно использовать для переноса
    текстовых сообщений и XML-сообщений.

  • Объект - Тело сообщения объекта ObjectMessage содержит объект Serializable Java.

  • Bytes - Тело сообщения объекта BytesMessage содержит поток неинтерпретированных байтов. Этот тип сообщения предназначен для буквального кодирования тела
    в соответствии с существующим форматом сообщений. Во многих случаях можно использовать один из других типов кузова, которые проще в использовании. Хотя JMS API позволяет использовать свойства сообщений с байтами
    сообщений, они обычно не используются, так как включение свойств
    может повлиять на формат.

Я думаю, вы должны преобразовать UUID в String.

+0

Совершенно верно, JMS MapMessage - это карта с ограничениями на объект, вам нужно обработать это в коде перед отправкой. –

+0

Вместо отправки обработчика метода для сообщения, как я делал, я закончил используя метод 'multicast()' 'RouteBuilder', чтобы отправить сообщение и использовать' Predicate' для фильтрации сообщений как непеременных. Теперь я работаю как шарм, когда я делаю это вне метода. – Orin

Смежные вопросы