2016-05-24 3 views
1

私はRabbitMQでSpring AMQPに取り組んでおり、MessageConverter(Jackson2JsonMessageConverter)ObjectMapperに設定しました。私がconvertAndSend(,,,)メソッドを送信者クラスからHashMap<String,Object>を渡して呼び出すと、ReceiverクラスhandleMessage()メソッドは、HashMapというメッセージを正常に受信しました。しかし、問題は、このHashMapはの文字列をList<String>としています。私がReceiverHashMapを受け取ったとき、私はList<String>を鍵で入手しようとしましたが、エラーList<Object> can't cast Object list to string listを与えました。これは、これは私の送信者クラスなぜJackson2JsonMessageConverterをリストに変換する<String>をリストにする<Object>

HashMap<String, Object> mailMap=new HashMap<String, Object>(); 
CustomerAccountUser customerAccountUser=customerAccountUserService.getCustomerAccountUserByUsername(customerAccountPayments.getCustomerName()); 
      ArrayList<String> emailAddress=new ArrayList<String>(); 
      emailAddress.add(customerAccountUser.getEmail()); 
template.convertAndSend(direct.getName(),environment.getRequiredProperty("rabbitmq.mail.key"),mailMap); 

ある

@Configuration 
public class RabbitMQConfig { 

    @Autowired 
    Environment environment; 

    final static String paymentQueue = "mobily-payment-queue"; 
    final static String mailQueue = "mobily-mail-queue"; 
    final static String orderQueue = "mobily-order-queue"; 
    final static String deductProductQueue = "mobily-deduct-product-queue"; 
    @Bean 
    public ConnectionFactory connectionFactory() { 
     CachingConnectionFactory connectionFactory = new CachingConnectionFactory(environment.getRequiredProperty("rabbitmq.host"),Integer.parseInt(environment.getRequiredProperty("rabbitmq.port"))); 
     connectionFactory.setUsername(environment.getRequiredProperty("rabbitmq.user")); 
     connectionFactory.setPassword(environment.getRequiredProperty("rabbitmq.pass")); 
     return connectionFactory; 
    } 

    @Bean 
    public MessageConverter jsonMessageConverter() { 
     final Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter(); 


     ObjectMapper mapper = new ObjectMapper(); 
     mapper.registerModule(new JodaModule()); 
     mapper.registerModule(new Hibernate4Module()); 
     mapper.setSerializationInclusion(Include.NON_NULL); 
     converter.setJsonObjectMapper(mapper); 
     return converter; 
    } 


    @Bean 
    public RabbitTemplate template(MessageConverter jsonMessageConverter) { 
     RabbitTemplate template = new RabbitTemplate(connectionFactory()); 
     template.setMessageConverter(jsonMessageConverter); 
     return template; 
    } 

    @Bean 
    public DirectExchange direct() { 
     return new DirectExchange("mobily.direct"); 
    } 

     @Bean 
     public Queue paymentQueue(){ 
      return new Queue(paymentQueue); 
     } 

     @Bean 
     public Queue deductProductQueue() { 
      return new Queue(deductProductQueue); 
     } 

     @Bean 
     public Queue orderQueue() { 
      return new Queue(orderQueue); 
     } 

     @Bean 
     public Queue mailQueue(){ 
      return new Queue(mailQueue); 
     } 

     @Bean 
     public Binding paymentBinding(DirectExchange direct, Queue paymentQueue) { 
      return BindingBuilder.bind(paymentQueue).to(direct).with(environment.getRequiredProperty("rabbitmq.payment.key")); 
     } 

     @Bean 
     public Binding deductProductBinding(DirectExchange direct, Queue deductProductQueue) { 
      return BindingBuilder.bind(deductProductQueue).to(direct).with(environment.getRequiredProperty("rabbitmq.deduct.product.key")); 
     } 

     @Bean 
     public Binding orderBinding(DirectExchange direct, Queue orderQueue) { 
      return BindingBuilder.bind(orderQueue).to(direct).with(environment.getRequiredProperty("rabbitmq.order.key")); 
     } 

     @Bean 
     public Binding mailBinding(DirectExchange direct, Queue mailQueue) { 
      return BindingBuilder.bind(mailQueue).to(direct).with(environment.getRequiredProperty("rabbitmq.mail.key")); 
     } 

     /*@Bean 
     Receiver receiver() { 
      return new Receiver(); 
     }*/ 

     @Bean 
     PaymentReceiver paymentReceiver(){ 

      return new PaymentReceiver(); 
     } 

     @Bean 
     DeductProductReceiver deductProductReceiver(){ 

      return new DeductProductReceiver(); 
     } 

     @Bean 
     OrderReceiver orderReceiver(){ 
      return new OrderReceiver(); 
     } 

     @Bean 
     MailReceiver mailReceiver(){ 

      return new MailReceiver(); 
     } 

     @Bean 
     SimpleMessageListenerContainer deductProductContainer(ConnectionFactory connectionFactory, MessageListenerAdapter deductProductListenerAdapter) { 
      SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); 
      container.setConnectionFactory(connectionFactory); 
      container.setQueueNames(deductProductQueue); 
      container.setMessageListener(deductProductListenerAdapter); 
      return container; 


     } 

     @Bean 
     MessageListenerAdapter deductProductListenerAdapter(DeductProductReceiver deductProductReceiver,MessageConverter jsonMessageConverter) { 
      return new MessageListenerAdapter(deductProductReceiver, jsonMessageConverter); 
     } 

     @Bean 
     SimpleMessageListenerContainer paymentContainer(ConnectionFactory connectionFactory, MessageListenerAdapter paymentListenerAdapter) { 
      SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); 
      container.setConnectionFactory(connectionFactory); 
      container.setQueueNames(paymentQueue); 
      container.setMessageListener(paymentListenerAdapter); 
      return container; 


     } 

     @Bean 
     MessageListenerAdapter paymentListenerAdapter(PaymentReceiver paymentReceiver,MessageConverter jsonMessageConverter) { 
      return new MessageListenerAdapter(paymentReceiver,jsonMessageConverter); 
     } 

     @Bean 
     SimpleMessageListenerContainer orderContainer(ConnectionFactory connectionFactory, MessageListenerAdapter orderListenerAdapter) { 
      SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); 
      container.setConnectionFactory(connectionFactory); 
      container.setQueueNames(orderQueue); 
      container.setMessageListener(orderListenerAdapter); 
      return container; 


     } 

     @Bean 
     MessageListenerAdapter orderListenerAdapter(OrderReceiver orderReceiver,MessageConverter jsonMessageConverter) { 
      return new MessageListenerAdapter(orderReceiver,jsonMessageConverter); 
     } 

     @Bean 
     SimpleMessageListenerContainer mailContainer(ConnectionFactory connectionFactory, MessageListenerAdapter mailListenerAdapter) { 
      SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); 
      container.setConnectionFactory(connectionFactory); 
      container.setQueueNames(mailQueue); 
      container.setMessageListener(mailListenerAdapter); 
      return container; 


     } 

     @Bean 
     MessageListenerAdapter mailListenerAdapter(MailReceiver mailReceiver,MessageConverter jsonMessageConverter) { 
      return new MessageListenerAdapter(mailReceiver,jsonMessageConverter); 
     } 




} 

Configクラス、送信者クラスとレシーバのクラスの私のコードですこれは私のレシーバ

public void handleMessage(HashMap<String,Object> mailMap){ 

    try{ 
     System.out.println("mail queue..................................." + mailMap); 
     String s1=(String)mailMap.get("subject"); 
     String s2=(String)mailMap.get("body"); 
     List<String> list=(List<String>)mailMap.get("emailAddress"); 
    } 
} 

このエラー

e2016-05-24 17:02:47 ERROR stderr:71 - java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String; 
2016-05-24 17:02:47 ERROR stderr:71 - at com.mobily.service.EmailService.sendEmail(EmailService.java:24) 
2016-05-24 17:02:47 INFO stdout:71 -  values 
2016-05-24 17:02:47 ERROR stderr:71 - at com.mobily.customer.rabbitmq.reciever.MailReceiver.handleMessage(MailReceiver.java:27) 
2016-05-24 17:02:47 ERROR stderr:71 - at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
2016-05-24 17:02:47 ERROR stderr:71 - at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
2016-05-24 17:02:47 ERROR stderr:71 - at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
2016-05-24 17:02:47 ERROR stderr:71 - at java.lang.reflect.Method.invoke(Method.java:497) 
2016-05-24 17:02:47 ERROR stderr:71 - at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:269) 
2016-05-24 17:02:47 ERROR stderr:71 - at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.invokeListenerMethod(MessageListenerAdapter.java:387) 
2016-05-24 17:02:47 ERROR stderr:71 - at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:298) 
2016-05-24 17:02:47 ERROR stderr:71 - at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:757) 
2016-05-24 17:02:47 ERROR stderr:71 - at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:680) 
2016-05-24 17:02:47 ERROR stderr:71 - at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$001(SimpleMessageListenerContainer.java:93) 
2016-05-24 17:02:47 ERROR stderr:71 - at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$1.invokeListener(SimpleMessageListenerContainer.java:183) 
2016-05-24 17:02:47 ERROR stderr:71 - at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:1358) 
2016-05-24 17:02:47 ERROR stderr:71 - at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:661) 
2016-05-24 17:02:47 ERROR stderr:71 - at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1102) 
2016-05-24 17:02:47 ERROR stderr:71 - at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:1086) 
2016-05-24 17:02:47 ERROR stderr:71 - at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1100(SimpleMessageListenerContainer.java:93) 
2016-05-24 17:02:47 ERROR stderr:71 - at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1203)`enter code here`e 
です
+0

'com.mobily.service.EmailService.sendEmail(EmailService.java:24)'のコードは何ですか?リストには文字列だけでなく、 –

答えて

2

さて、残念ながらJackson2JsonMessageConverterはあなたのためにできません。

それはロジックが3つのメッセージヘッダに基づいています:

public static final String DEFAULT_CLASSID_FIELD_NAME = "__TypeId__"; 

public static final String DEFAULT_CONTENT_CLASSID_FIELD_NAME = "__ContentTypeId__"; 

public static final String DEFAULT_KEY_CLASSID_FIELD_NAME = "__KeyTypeId__"; 

だから、それは何ができるかを最高のHashMap<Foo, Bar>のようなものです。しかし、メッセージヘッダーにそのような情報がないため、適切なネストされたコンテナタイプを構築することはできません。

確かに、handleMessageコードでさらに下流の変換(キャスト)ロジックをダウンストリームで行う必要があります。私はList<String>にキャストしないことを意味しますが、各項目を繰り返してキャストします。

ご送信ロジックに従ってものの:

ArrayList<String> emailAddress=new ArrayList<String>(); 
emailAddress.add(customerAccountUser.getEmail()); 

かわりList<String>arrayString[])を使用しようとすることができます。配列は、コンテナではなく生の型とみなされるため、正しく動作するはずです。

+0

ありがとうございます:artem bilan、はい私はすでにString []で試みましたが、同じエラーです。私は1つずつ繰り返します –

関連する問題