【问题标题】:Sending object using spring boot JMS使用 Spring Boot JMS 发送对象
【发布时间】:2016-01-15 10:09:43
【问题描述】:

我做了 2 个类:1 个发送和 1 个接收。目前我可以只发送一个基本的字符串,而且效果很好

发件人

@Component
public class Sender {

    @Autowired
    private JmsTemplate jmsTemplate;

    //Script must be serializable
    public void testSend(/*Script*/String message)
    {
        jmsTemplate.convertAndSend("my-destination", message);      
    }
}

接收者

@Component
public class Receiver {

    @Autowired
    private ConfigurableApplicationContext context;

    @JmsListener(destination = "my-destination")
    public void receive(String message) {
        System.out.println(message);

        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        context.close();
    }
}

我无法在这里实现正确的代码,如果有人能告诉我如何做,我将不胜感激

我会做几乎相同的事情,但要发送复杂的 java 对象(可序列化)。并且接收者类应该能够识别对象的类。

【问题讨论】:

  • 什么不起作用,目前还不清楚你在问什么。请澄清什么没有按预期工作。这也是一个应用程序,多个还是....?
  • 写在标题中,我想做几乎一样的东西,但是发送复杂的java对象,目前我只能发送一个String。对不起,我修改了我的帖子
  • 只需发送一个对象...如前所述,不清楚您想要什么,您尝试过什么。
  • 我试图创建我的类的一个实例(只是一个具有很少属性和 getter/setter 的基本类)但是当我尝试使用与 String 相同的方式发送它时它没有工作。我认为我必须使用其他方式,例如我自己的班级,但我不知道该怎么做。
  • 什么不起作用...仅仅说它不起作用还不够清楚...而且我问你试过什么不起作用。还有什么不起作用,您是否在发送时遇到异常,您没有收到任何东西......什么......更准确。

标签: java spring spring-boot jms


【解决方案1】:

你可以直接创建一个 ByteMessage 并序列化你的对象(对象必须是可序列化的):

    this.jmsTemplate.send("my-destination", new MessageCreator() {
        public Message createMessage(Session session) throws JMSException {
            final ByteArrayOutputStream bOut = new ByteArrayOutputStream();
            final ObjectOutputStream oOut = new ObjectOutputStream(bOut);
            oOut.writeObject(_object); // where object is the object to serialize
            bytes[] data = bOut.toByteArray();
            return session.createByteMessage(data);
        }
    });

    @JmsListener(destination = "my-destination")
    public void receive(Message message) {
        final BytesMessage message = (BytesMessage) _message;
        final byte[] array = new byte[Long.valueOf(message.getBodyLength()).intValue()];
        message.readBytes(array);
        final ByteArrayInputStream bIn = new ByteArrayInputStream(_bytes);
        final ObjectInputStream oIn = new ObjectInputStream(bIn);
        Object obj = oIn.readObject(); // the deserialized object
    }

【讨论】:

  • 如果对象是可序列化的,您可以简单地使用对象消息,这就是 spring kms 开箱即用的功能。无需搞砸自己的消息创建。
  • 我搜索的内容,你有一个简单的例子可以帮助我吗?否则,当我知道我必须使用什么时,我可以自己搜索。谢谢
  • 我曾经遇到过 ObjectMessage 的问题,这个解决方案在我的情况下效果更好,特别是因为如果需要我们可以使用您自己的序列化程序。但是对于简单的对象 MessageObject 可能会解决问题。
  • 如果您需要不同的序列化程序,最好使用MarshallingMessageConverter 而不是自己尝试。尝试使用不在它周围的框架:)
  • 谢谢!我会尝试,我会发布它在我的情况下的工作:)
猜你喜欢
  • 1970-01-01
  • 2020-04-06
  • 2015-09-16
  • 2020-04-05
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
  • 2020-11-16
  • 2018-10-13
相关资源
最近更新 更多