我的客户班课程如下:
AbsTracteMcrabBitConfiguration.java@Configuration
public abstract class AbstractEMCRabbitConfiguration {
//@Value("${emc.rabbit.exchange.core}")
protected static String CORE_DATA_EXCHANGE_NAME = "X";
@Value("${emc.rabbit.queue.core.macs}")
protected static String MAC_REQUEST_QUEUE_NAME = "data.core.macs";
protected static String MAC_REQUEST_ROUTING_KEY = MAC_REQUEST_QUEUE_NAME;
//@Value("${emc.rabbit.hostname}")
protected String hostname;
//@Value("${emc.rabbit.username}")
protected String username;
//@Value("${emc.rabbit.password}")
protected String password;
//@Value("${emc.rabbit.port:5672}")
protected Integer port = 5672;
protected abstract void configureRabbitTemplate(RabbitTemplate template);
@Bean
public ConnectionFactory connectionFactory(){
CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost");
connectionFactory.setUsername("test");
connectionFactory.setPassword("test");
connectionFactory.setPort(port);
connectionFactory.setRequestedHeartBeat(60);
return connectionFactory;
}
@Bean
public RabbitTemplate rabbitTemplate(){
RabbitTemplate template = new RabbitTemplate(connectionFactory());
template.setMessageConverter(jsonMessageConverter());
configureRabbitTemplate(template);
return template;
}
@Bean
public MessageConverter jsonMessageConverter() {
JsonMessageConverter jsonMessageConverter = new JsonMessageConverter();
jsonMessageConverter.setClassMapper(defaultClassMapper());
return jsonMessageConverter;
}
@Bean
public DefaultClassMapper defaultClassMapper() {
DefaultClassMapper defaultClassMapper = new DefaultClassMapper();
defaultClassMapper.setDefaultType(byte.class);
return defaultClassMapper;
}
@Bean
public DirectExchange coreDataExchange() { return new DirectExchange(CORE_DATA_EXCHANGE_NAME); }
@Bean
public AmqpAdmin amqpAdmin() {
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory());
return rabbitAdmin;
}
}
rabbitClientConfiguration.java
@Configuration
@Import({JacksonConfiguration.class, MessagingConfiguration.class})
public class RabbitClientConfiguration extends AbstractEMCRabbitConfiguration {
@Inject
private JacksonConfiguration jacksonConfiguration;
@Inject
private MessagingConfiguration messagingConfiguration;
//@Value("${data.core.pattern}")
//private String coreDataRoutingKey;
//@Inject
//private ClientHandler clientHandler;
@Override
public void configureRabbitTemplate(RabbitTemplate rabbitTemplate) {
rabbitTemplate.setRoutingKey("data.core.macs");
}
@Bean
public SimpleMessageListenerContainer messageListenerContainer(){
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory());
container.setQueues(macsDataQueue());
container.setMessageListener(messageListenerAdapter());
container.setAcknowledgeMode(AcknowledgeMode.AUTO);
return container;
}
@Bean
MessageListenerAdapter messageListenerAdapter(){
return new MessageListenerAdapter(clientHandler(jacksonConfiguration.objectMapper(),messagingConfiguration.macMessageHandler(messagingConfiguration.messagingFactory())),jsonMessageConverter());
//return new MessageListenerAdapter(clientHandler,"receiveMessage");
}
@Bean
ClientHandler clientHandler(ObjectMapper objectMapper, IMessageHandler macMessageHandler){
ClientHandler clientHandler = new ClientHandler();
clientHandler.setObjectMapper(objectMapper);
clientHandler.setMacMessageHandler(macMessageHandler);
return clientHandler;
}
@Bean
public Queue macsDataQueue(){
return rabbitAdmin().declareQueue();
}
@Bean
public Binding macsDataBinding(){
return BindingBuilder.bind(macsDataQueue()).to(coreDataExchange()).with("data.core.macs");
}
@Bean
public AmqpAdmin rabbitAdmin() { return new RabbitAdmin(connectionFactory());}
}
从经纪人收到的典型消息看起来像:
(正文:'{“ MessagedTolist”:[{“ createDate”:14777396301061,“ message”:“ {\” Mac \ \“: - 99,\”设备\“:444,\” i findEx \“:55,\” ip \“:668,\” arpdevice \“:99,\” aprifindex \“:\” \“ \”,\“ vlanindex \”:111,\ \“ enddevice \” ,,,, “ crudoperation”:“ update”}],“ senderServerid”:“ 5B36A7A1-C17D-471F-B16E-E8E0BF4AFB5B”,“ MESSEDID”:“ 5B 36A7A1-C17D-471F-B16E-E8E0BF4AFB5B20“,“ RebasoftServerType”:“ AC”,“ TaskType”:“ Mac”}'MessageProperties [headers = {},timestamp = null,messageId = null,userId = null,appid = null,clusterId = null,type = null,correlationId = [53,98,51,51,51,51,54,97,97,55,55,55,55,97,49,49,45 ,99、49、55、100、45、52、55、49、102、45、98、49、54, 101、45、101、56、101、48、98、102、52、52、97、97、97、98、53、98、50、48],回复= null,contentType = application/json,contentEncoding = null,contentLength,contentLength,contentLength,contentLength ,fiverymode =持续,有效期= null,Priority = 0,重新列出= false,receedexchange = x, RecterRoutingKey = data.core.macs,veliverTag = 2,messageCount = 0])
注:内容类型是'application/json'
任何帮助我都会感谢。
CASUSET:org.codehaus.jackson.map.jsonmappingexception:无法从start_object token token token token token token token token
我在此应用程序中解码您的消息没有问题...eDit
@SpringBootApplication
public class So40240771Application {
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext context = SpringApplication.run(So40240771Application.class, args);
RabbitTemplate template = context.getBean(RabbitTemplate.class);
String body = "{"
+ "\"messageDTOList\":"
+ "[{\"createdDate\":1477396301061,"
+ "\"message\":\"{\\\"mac\\\":-99,\\\"device\\\":444,\\\"ifindex\\\":55,\\\"ip\\\":668,\\\"arpdevice\\\":99,\\\"aprifindex\\\":\\\"\\\",\\\"vlanindex\\\":111,\\\"enddevice\\\":133}\","
+ "\"crudOperation\":\"UPDATE\"}],"
+ "\"senderServerId\":\"5b36a7a1-c17d-471f-b16e-e8e0bf4afb5b\","
+ "\"messageId\":\"5b36a7a1-c17d-471f-b16e-e8e0bf4afb5b20\","
+ "\"rebasoftServerType\":\"AC\","
+ "\"taskType\":\"MAC\""
+ "}";
MessageProperties properties = new MessageProperties();
properties.setContentType("application/json");
template.send("foo", MessageBuilder.withBody(body.getBytes()).andProperties(properties).build());
Thread.sleep(6000);
context.close();
}
@Bean
public Jackson2JsonMessageConverter converter() {
Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
return converter;
}
@Bean
public SimpleMessageListenerContainer container(ConnectionFactory connectionFactory) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
container.setMessageListener(new MessageListenerAdapter(new Object() {
void handleMessage(Object in) {
System.out.println(in.getClass() + "\n" + in);
}
}, converter()));
container.setQueueNames("foo");
return container;
}
}
恢复:
class java.util.LinkedHashMap
{messageDTOList=[{createdDate=1477396301061, message={"mac":-99,"device":444,"ifindex":55,"ip":668,"arpdevice":99,"aprifindex":"","vlanindex":111,"enddevice":133}, crudOperation=UPDATE}], senderServerId=5b36a7a1-c17d-471f-b16e-e8e0bf4afb5b, messageId=5b36a7a1-c17d-471f-b16e-e8e0bf4afb5b20, rebasoftServerType=AC, taskType=MAC}
Map
如果要解码到对象,则需要标题中的类型信息,或者需要使用类映射器配置转换器(例如
DefaultClassMapper
.
。第二,看起来“消息”元素是双重编码的JSON-它已经是JSON,并且已重新编码)。
I发现了这个问题,看来我的配置类中的MessageListenerAdapter不喜欢带有构造函数参数的客户端手。一旦我删除了构造函数参数,它可以正常工作。
在您的有效载荷/数据类中需要构造函数。
完成模型类以实现
Serializable
在我的情况下,我需要从IntegrationFlow到MapMessage掩盖MessageBuilder。
注 - 我从SimpleConverter中复制了摘要代码,因为我收到的MapMessage。