出版商未能收到关于rabbitmq的第一条消息

时间:2015-07-09 12:50:47

标签: rabbitmq spring-amqp

我试图在RabbitMQ上实现集成测试,所以我有一个已发布的基本消费者的设置,以便在队列中发送和接收消息。

 try
  {

     ConnectionFactory factory = new ConnectionFactory();
     factory.setUsername("guest");
     factory.setPassword("guest");
     factory.setHost("localhost");
     factory.setPort(5672);
     connection = factory.newConnection();
     channel = connection.createChannel();
     channel.queueDeclare(RPC_QUEUE_NAME_KEY, DURABLE, EXCLUSIVE, AUTO_DELETE, null);
     channel.exchangeDeclare(RPC_EXCHANGE_NAME, "direct");
     String queueName = channel.queueDeclare().getQueue();
     channel.queueBind(queueName, RPC_EXCHANGE_NAME, RPC_QUEUE_NAME_KEY);
     channel.basicQos(1);
     QueueingConsumer consumer = new QueueingConsumer(channel);
     channel.basicConsume(queueName, false, consumer);

     System.out.println(" [x] Awaiting RPC requests");
     while(true)
     {

        QueueingConsumer.Delivery delivery = consumer.nextDelivery();
        BasicProperties props = delivery.getProperties();
        BasicProperties replyProps = new BasicProperties.Builder().correlationId(props.getCorrelationId()).build();

        try
        {
           RetrieveUnencryptedCardsResponse response = null;
           JAXBContext jaxbContext = JAXBContext.newInstance(RetrieveUnencryptedCardsRequest.class);
           Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
           StringReader reader = new StringReader(new String(delivery.getBody()));
           JAXBElement<RetrieveUnencryptedCardsRequest> message = jaxbUnmarshaller.unmarshal(new StreamSource(reader), RetrieveUnencryptedCardsRequest.class);

           response = retrieveUnencryptedCardsResponse(message);

           JAXBContext jaxbMarshallingContext = JAXBContext.newInstance(RetrieveUnencryptedCardsResponse.class);
           Marshaller jaxbMarshaller = jaxbMarshallingContext.createMarshaller();
           jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
           ByteArrayOutputStream xmlStream = new ByteArrayOutputStream();
           jaxbMarshaller.marshal(new JAXBElement<RetrieveUnencryptedCardsResponse>(_RetrieveUnencryptedCardsResponse_QNAME, RetrieveUnencryptedCardsResponse.class, null,
              response), xmlStream);
           data = xmlStream.toByteArray();
           xmlStream.close();
        }
        catch(Exception e)
        {
           logger.error(e);
        }
        finally
        {

           channel.basicPublish("", props.getReplyTo(), replyProps, data);
           channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);

        }
     }
  }
  catch(Exception e)
  {
     e.printStackTrace();

  }
  finally
  {
     if(connection != null)
     {
        try
        {
           connection.close();
        }
        catch(Exception ignore)
        {
        }
     }
  }

}

当我尝试从队列接收消息时,会出现问题。我无法接收第一条消息,但我可以从第二条消息。

我不知道这是否有帮助:

<rabbit:queue id="account.amqp.default.reply.queue"
    name="${vendor.account.amqp.default.reply.queue}" durable="${connector.fixed.queue.durable}"
    auto-delete="false" exclusive="false">
    <rabbit:queue-arguments>
        <entry key="x-message-ttl">
            <value type="java.lang.Long">${vendor.account.amqp.default.reply.ttl}</value>
        </entry>
        <entry key="x-ha-policy" value="${vendor.account.default.queue.ha.policy}" />
        <entry key="x-ha-policy-params"
            value="#{ T(org.springframework.util.CollectionUtils).arrayToList((T(org.springframework.util.StringUtils).commaDelimitedListToSet('${vendor.account.default.queue.ha.nodes}')).toArray())}" />
    </rabbit:queue-arguments>
</rabbit:queue>

<rabbit:template id="pamRabbitTemplate"
    connection-factory="connectionFactory" message-converter="accountMarshallingMessageConverter"
    reply-timeout="${gateway.reply.timeout}" reply-queue="${vendor.account.amqp.default.reply.queue}">
    <rabbit:reply-listener
        concurrency="${vendor.account.amqp.default.reply.queue.consumers}" />
</rabbit:template>

<bean id="accountMarshallingMessageConverter"
    class="org.springframework.amqp.support.converter.MarshallingMessageConverter">
    <property name="marshaller" ref="fuelNotificationWsMarshaller" />
    <property name="unmarshaller" ref="fuelNotificationWsMarshaller" />
</bean>    

和pamRabbitTemplate:

<int:channel id="channel.accounts.request" />
<int:channel id="channel.accounts.reply" />
<int:channel id="channel.accounts.outbound.request" />
<int:channel id="channel.accounts.outbound.reply" />
<int:channel id="channel.accounts.error" />

<int-amqp:outbound-gateway request-channel="channel.accounts.outbound.request"
    reply-channel="channel.accounts.outbound.reply" amqp-template="pamRabbitTemplate"
    exchange-name="${pam.exchange.service.account}" routing-key="${pam.routingkey.service.account}"
    requires-reply="false" />

<int:gateway id="gateway.account"
    service-interface="notification.fuelnotification.infrastructure.integration.RetrieveAccountsGateway"
    error-channel="channel.error" default-reply-timeout="${gateway.reply.timeout}">
    <int:method name="retrieveUnencryptedCards"
        request-channel="channel.accounts.request" reply-channel="channel.accounts.reply" />
</int:gateway>

<int:transformer id="accountsReqTf" method="transform"
    input-channel="channel.accounts.request" output-channel="channel.accounts.outbound.request">
    <bean
        class="notification.fuelnotification.infrastructure.transformer.common.AccountsRequestTransformer" />
</int:transformer>

<int:transformer id="accountResTf" method="transform"
    input-channel="channel.accounts.outbound.reply" output-channel="channel.accounts.reply">
    <bean
        class="notification.fuelnotification.infrastructure.transformer.common.UnencryptedCardsResponseTransformer" />
</int:transformer>

<int:transformer id="errorLoggerTransformer"
    method="logDetails" input-channel="channel.error">
    <bean
        class="notification.fuelnotification.infrastructure.config.amqp.ErrorChannelDetailLogger" />
</int:transformer>

0 个答案:

没有答案