【问题标题】:How to receive object using Spring jmsTemplate如何使用 Spring jmsTemplate 接收对象
【发布时间】:2016-12-15 09:00:25
【问题描述】:

这是我的用例:

  1. RESTFul 调用服务以使用 jmsTemplate 在 jms 队列中创建消息:

    @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. 另一个 RESTFul 调用服务从队列中获取消息,使用:

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

如您所见,它非常简单。我知道我可以使用带有 @JmsListener 注释的异步侦听器,但我需要同步接收操作。当我尝试这段代码时,我得到了一个类转换异常(这很有意义)。我的问题:如何将消息 (ActiveMQObjectMessage) 转换为我的 POJO (ApplicationContext)?

堆栈跟踪:

严重:servlet [dispatcher] 在路径 [/ApplicationContextManager] 的上下文中的 Servlet.service() 引发异常 [请求处理失败;嵌套异常是 java.lang.ClassCastException: org.apache.activemq.command.ActiveMQObjectMessage cannot be cast to com.tigidou.commons.appcontext.model.ApplicationContext] 根本原因 java.lang.ClassCastException: org.apache.activemq.command.ActiveMQObjectMessage 无法转换为 com.tigidou.commons.appcontext.model.ApplicationContext

【问题讨论】:

    标签: java spring-boot activemq


    【解决方案1】:

    您是否尝试将 JMS 消息转换为您的 POJO(应用程序特定对象)如果是,那么以下内容可能对您有所帮助。

    org.springframework.jms.support.converter 包提供了一个 MessageConverter 抽象来在 Java 对象和 JMS 消息之间进行转换。

    同一行: https://stackoverflow.com/a/11863662/7269013

    【讨论】:

    • 我已经尝试过stackoverflow.com/a/11863662/7269013 中提出的建议,但我得到了这个错误:javax.jms.JMSException: Failed to build body from content。代理无法使用可序列化的类。原因:java.lang.ClassNotFoundException:禁止类com.tigidou.commons.appcontext.model.ApplicationContext!不信任此类被序列化为 ObjectMessage 有效负载。
    • [link] (activemq.apache.org/objectmessage.html) 解释了如何在 JMS (ActiveMQ) 中包含 pojo 序列化。这不会返回错误。补充:ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); connectionFactory.setBrokerURL(DEFAULT_BROKER_URL); connectionFactory.setTrustedPackages(Arrays.asList("com.desjardins.assurancedommages.commons"));
    【解决方案2】:

    答案:

    基于包含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;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-29
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 2016-10-26
      • 2013-07-30
      • 1970-01-01
      • 2012-03-31
      • 2015-03-08
      相关资源
      最近更新 更多