0
Spring集成4.1.2.RELEASE
我试图通过注解来配置有效载荷路由器。但是,我正在接收一个字节[]作为方法参数,而不是消息POJO。我试图按照SO answer中的建议建模我的解决方案,但答案使用本机类型作为消息,而我希望使用POJO。我在下面的配置代码中的auditPayloadRouter配置中做了什么错误?
诠释问题:
@Router(inputChannel="auditRoutingChannel", autoStartup="true",
channelMappings=
{"com.company.data.model.shared.AccountAudit=audit.account",
"com.company.data.model.shared.BlacklistAudit=audit.blacklist",
"com.company.data.model.shared.MediaAudit=audit.item"})
public String auditPayloadRouter(Object o)
满配置:
@Configuration
@EnableIntegration
public class AuditConfig2 {
@Autowired
AuditMessagingOperations auditMessagingOperations;
private Queue auditQueue;
private ConnectionFactory connectionFactory;
@Autowired
public void setAuditQueue(Queue auditQueue) {
this.auditQueue = auditQueue;
}
@Autowired
public void setConnectionFactory (ConnectionFactory connectionFactory) {
this.connectionFactory = connectionFactory;
}
@Bean
public AmqpInboundChannelAdapter amqpInboundChannelAdapter(
@Qualifier("jsonMessageConverter") MessageConverter messageConverter
, MessageChannel errorChannel) {
SimpleMessageListenerContainer listenerContainer =
new SimpleMessageListenerContainer(connectionFactory);
listenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
listenerContainer.setAutoStartup(true);
listenerContainer.setConcurrentConsumers(1);
listenerContainer.setMessageConverter(messageConverter);
listenerContainer.setQueues(auditQueue);
listenerContainer.setChannelTransacted(false);
listenerContainer.setPrefetchCount(100);
AmqpInboundChannelAdapter a = new
AmqpInboundChannelAdapter(listenerContainer);
a.setAutoStartup(true);
a.setErrorChannel(errorChannel);
a.setOutputChannel(auditRoutingChannel());
return a;
}
@Bean(name="auditRoutingChannel")
public MessageChannel auditRoutingChannel() {
DirectChannel c = new DirectChannel();
c.setComponentName("auditRoutingChannel");
c.setBeanName("auditRoutingChannel");
return c;
}
@Router(inputChannel="auditRoutingChannel", autoStartup="true",
channelMappings=
{"com.company.data.model.shared.AccountAudit=audit.account",
"com.company.data.model.shared.BlacklistAudit=audit.blacklist",
"com.company.data.model.shared.MediaAudit=audit.item"})
public String auditPayloadRouter(Object o) {
if (o == null) {
return "errorChannel";
}
//DEBUG - Print out the unexpected byte[]
String out = null;
try {
out = new String((byte[])o, "UTF-8");
} catch (UnsupportedEncodingException e) {
System.out.println(e.getMessage());
}
System.out.println(out);
if (o instanceof AccountAudit ||
o instanceof BlacklistAudit ||
o instanceof MediaAudit) {
return o.getClass().getName();
}
return "nullChannel";
}
}
我不遵守那条日志信息。我应该注意到,我正在为此替换一个可用的XML配置,并且XML版本正确地处理了路由。项目中有些人喜欢使用注释风格进行配置,因此我正在转换我们的Spring Integration配置。 –
我想我发现了这个问题。我证实AMQP头文件包含content_type:application/json,所以我开始寻找其他地方。事实证明,我需要在SimpleMessageListenerContainer和AmqpInboundChannelAdapter上都设置messageConverter。 –