我有一个使用JMS
(ActiveMQ
)的Spring App,并发送两种类型的消息。
Java
对象,实现了Serializable
json
关于后一种消息传递方法,发送者/接收者使用为MessageConverter
配置的json
直到这里应用程序都能正常工作。
我需要的是一种在发送和接收json
数据时获取并打印数据的方法。
因此:
当然,转换过程自动在内部进行,但是出于报告目的,我需要发送和接收json数据。目前,该应用只能在发送和接收Java对象时“直接”运行。
如何完成粗体部分?
答案 0 :(得分:1)
只需自己调用JSON消息转换器来创建一个TextMessage
并在发送之前将其打印出来;在使用方,同样的事情,接收一条短信,打印出来,然后使用代码中的转换器将其转换为对象。
编辑
另一种选择是将转换器子类化,并在转换之后/之前进行日志记录。
编辑
这是一个例子:
@SpringBootApplication
public class So51251864Application {
public static void main(String[] args) {
SpringApplication.run(So51251864Application.class, args);
}
@Bean
public ApplicationRunner runner(JmsTemplate template) {
return args -> template.convertAndSend("foo", new Foo("baz"));
}
@Bean
public MessageConverter converter() {
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter() {
@Override
public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException {
TextMessage message = (TextMessage) super.toMessage(object, session);
System.out.println("outbound json: " + message.getText());
return message;
}
@Override
public Object fromMessage(Message message) throws JMSException, MessageConversionException {
System.out.println("inbound json: " + ((TextMessage) message).getText());
return super.fromMessage(message);
}
};
converter.setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName("type");
return converter;
}
@JmsListener(destination = "foo")
public void listen(Foo foo) {
System.out.println(foo);
}
public static class Foo {
private String bar;
public Foo() {
super();
}
public Foo(String bar) {
this.bar = bar;
}
public String getBar() {
return this.bar;
}
public void setBar(String bar) {
this.bar = bar;
}
@Override
public String toString() {
return "Foo [bar=" + this.bar + "]";
}
}
}
和
outbound json: {"bar":"baz"}
inbound json: {"bar":"baz"}
Foo [bar=baz]