2016-12-14 2 views
0

Вот мой случай использования:Как получить объект, используя Spring jmsTemplate

  1. успокоительных вызывает службу для создания сообщения в очереди JMS с помощью jmsTemplate:

    @Autowired 
    JmsTemplate jmsTemplate; 
    public void sendMessage(final ApplicationContext appContext) { 
        jmsTemplate.send(new MessageCreator() { 
         @Override 
         public Message createMessage(Session session) throws JMSException { 
         ObjectMessage objectMessage = session.createObjectMessage(appContext); 
         return objectMessage; 
        } 
    }); 
    } 
    
  2. Других успокоительный называет сервис, чтобы получить сообщение из очереди с помощью:

    public ApplicationContext getMessage(final ApplicationContext appContext) { 
        Object wObj = jmsTemplate.receive(MessagingConfiguration.NAMED_QUEUE); 
        return (ApplicationContext)wObj; 
    } 
    

Как вы можете прочитать, это довольно просто. Я знаю, что я могу использовать асинхронные прослушиватели с аннотацией @JmsListener, но мне нужно синхронизировать действие получения. Когда я пытаюсь использовать этот код, я получаю исключение класса (которое делает чувство). Мой вопрос: как преобразовать сообщение (ActiveMQObjectMessage) в мой POJO (ApplicationContext)?

StackTrace:

SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/ApplicationContextManager] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: org.apache.activemq.command.ActiveMQObjectMessage cannot be cast to com.tigidou.commons.appcontext.model.ApplicationContext] with root cause java.lang.ClassCastException: org.apache.activemq.command.ActiveMQObjectMessage cannot be cast to com.tigidou.commons.appcontext.model.ApplicationContext

ответ

0

Вы пытаетесь преобразовать сообщение JMS в вашем POJO (приложение конкретного объекта) Если да, то следующий может быть ваша помощь.

Пакет org.springframework.jms.support.converter обеспечивает абстракцию MessageConverter для преобразования между объектами Java и сообщениями JMS.

Что-то в том же духе: https://stackoverflow.com/a/11863662/7269013

+0

Я попробовал то, что предлагается в http://stackoverflow.com/a/11863662/7269013, но я получаю эту ошибку: javax.jms.JMSException: Не удалось создать тело из содержимого. Сериализуемый класс недоступен для брокера. Причина: java.lang.ClassNotFoundException: Запрещенный класс com.tigidou.commons.appcontext.model.ApplicationContext! Этот класс не считается сериализованным как полезная нагрузка ObjectMessage. – user7228459

+0

[ссылка] (http://activemq.apache.org/objectmessage.html) объясняет, как включить сериализацию pojo в JMS (ActiveMQ). Это не возвращает ошибок. Добавлено: ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); \t \t подключениеFactory.setBrokerURL (DEFAULT_BROKER_URL); \t \t connectionFactory.setTrustedPackages (Arrays.asList ("com.desjardins.assurancedommages.commons")); – user7228459

0

Ответ:

Основываясь на сообщении об ошибке, которое содержит ссылку на http://activemq.apache.org/objectmessage.html. Я изменил следующий на моей конфигурации фабрики соединений (добавить в доверенный пакет):

@Bean 
public ActiveMQConnectionFactory connectionFactory(){ 
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); 
    connectionFactory.setBrokerURL(DEFAULT_BROKER_URL); 
    connectionFactory.setTrustedPackages(Arrays.asList("com.tigidou.commons")); 
    return connectionFactory; 
} 
Смежные вопросы