gpt4 book ai didi

java - 如何序列化您在 JMS 模板 Convert 和 Send 方法中发送的自定义对象

转载 作者:行者123 更新时间:2023-11-30 10:25:27 25 4
gpt4 key购买 nike

我正在使用下面提到的代码发布到一个主题中。它的格式为 convertAndSend(Destination destination, Object message)

    Event event;
jmsTemplate.convertAndSend(topic, event);

我现在的Event界面是这样的,

    public interface Event {

public boolean isEmpty();

public AcEventDatafileTransaction getDatafileTransaction();

public AcEventObjectTransaction getObjectTransaction();

boolean isDatafileTransaction();

boolean isObjectTransaction();

boolean isRdbmsTransaction();

String getTransactionId();

}

它的实现是这样的,

    public class EventPublisherImpl implements Event {
private final AcTransactionRecord transactionRecord;
private final Ac ac;
private final String[] actualTemplates;
private final String[] curveTemplates;

public AcEventPublisherImpl(final Ac ac,
final String[] actualTemplates,
final String[] curveTemplates,
final AcTransactionRecord acTransactionRecord) {
this.ac = ac;
this.transactionRecord = acTransactionRecord;
this.actualTemplates = actualTemplates;
this.curveTemplates = curveTemplates;
}

@Override
public boolean isEmpty() {
return transactionRecord.isEmpty();
}

@Override
public AcEventDatafileTransaction getDatafileTransaction() {
if (isDatafileTransaction()) {
return new AcEventDatafileTransactionPublisherImpl(transactionRecord.getDatafileTransaction());
}
return null;
}


@Override
public AcEventObjectTransaction getObjectTransaction() {
if (isObjectTransaction()) {
return new AcEventObjectTransactionPublisherImpl(ac, actualTemplates, curveTemplates, transactionRecord.getObjectOperations());
}
return null;
}

@Override
public boolean isDatafileTransaction() {
return transactionRecord.getType() == AcTransactionRecord.DATAFILE_TRANS;
}

@Override
public boolean isObjectTransaction() {
return transactionRecord.getType() == AcTransactionRecord.OBJECT_TRANS;
}

@Override
public boolean isRdbmsTransaction() {
return transactionRecord.getType() == AcTransactionRecord.RDBMS_TRANS;
}

@Override
public String getTransactionId() {
if (transactionRecord != null) {
return Integer.toString(transactionRecord.getNumber());
}
return "";
}
}

如何将其转换为可序列化的形式?

我的全部目标是将事件对象发布到主题中。为此,我正在使用 convertAndSend 方法。该方法需要一个序列化类的对象,而我目前没有。这就是我想要实现的目标。我查看了使用消息转换器 https://examples.javacodegeeks.com/enterprise-java/spring/spring-framework-jmstemplate-example/ 序列化具有少量属性的类的示例

请通过代码建议一种方法或指出适当的示例以及这对我有何帮助。

最佳答案

The overloaded methods convertAndSend() and receiveAndConvert() in JmsTemplate delegate the conversion process to an instance of the MessageConverter interface. This interface defines a simple contract to convert between Java objects and JMS messages. The default implementation SimpleMessageConverter supports conversion between String and TextMessage, byte[] and BytesMesssage, and java.util.Map and MapMessage.

因此,为了支持自定义类型,我们必须创建实现 MessageConverter 的自定义转换器,以将 Event 对象转换为支持的消息类型之一。最简单的解决方案是注册spring提供的MappingJackson2MessageConverter,它支持将对象转换为json形式的TextMessage

@Bean // Serialize message content to json using TextMessage
public MessageConverter jacksonJmsMessageConverter() {
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
converter.setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName("_type");
return converter;
}

如果您想创建自己的转换器,您可以查看如何在源代码上完成序列化过程。

要接收消息,最简单的方法是使用@JmsListener注解,spring会使用注册的转换器隐式地将消息转换成它的java类型

@Component
public class Receiver {
@JmsListener(destination = "dest")
public void receiveMessage(Event event) {
// do whatever you need with the event
}
}

另一种方法是使用javax.jms.MessageListener,但您需要自己手动转换消息。

@Component
public class ExampleListener implements MessageListener {

@Autowired
private ObjectMapper objectMapper;

public void onMessage(Message message) {
if (message instanceof TextMessage) {// we set the converter targetType to text
try {
String json = ((TextMessage) message).getText(); // here you have your event object as json string
Event event = objectMapper.readValue(json, Event.class); // convert back to event object
}
catch (JMSException ex) {
throw new RuntimeException(ex);
}
}
else {
throw new IllegalArgumentException("Message must be of type TextMessage");
}
}

引用:

关于java - 如何序列化您在 JMS 模板 Convert 和 Send 方法中发送的自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46191710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com