2017-09-20 9 views
0

春ウサギのバージョン:1.7.4.RELEASE春RabbitMQの待機確認タイムアウト

これは私のコードです:

@Configuration 
public class RabbitmqConfiguration { 

    public RabbitmqConfiguration(RabbitTemplate rabbitTemplate,ConfirmCallback confirmCallback) throws Exception { 
     rabbitTemplate.setConfirmCallback(confirmCallback); 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); 
     rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter(mapper)); 
    } 

} 

@Component 
@Slf4j 
public class OrderStatusChangeComponentImpl implements OrderStatusChangeComponent,ConfirmCallback{ 
    @Autowired 
    private RabbitTemplate rabbitTemplate; 
    @Autowired 
    private OrderMessageLogComponent orderMessageLogComponent; 
    @Autowired 
    private Gson gson; 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.springframework.amqp.rabbit.core.RabbitTemplate.ConfirmCallback# 
    * confirm(org.springframework.amqp.rabbit.support.CorrelationData, boolean, 
    * java.lang.String) 
    */ 
    public void confirm(CorrelationData correlationData, boolean ack, String cause) { 
     long nowTime = System.nanoTime(); 

    String uuid = correlationData.getId(); 
    if (ack) { 
     orderMessageLogComponent.deleteOrderMessageLogByUUID(uuid); 
    } else { 
     log.error(cause, nowTime); 
    } 
} 

私はJMeterのおよそ512スレッド1000個のループによってのRabbitMQ送信MSGをテストします。

ログを参照してくださいエラーが多すぎます。 チャネルシャットダウン:クリーンチャネルシャットダウン。プロトコル方法:#method<channel.close>(reply-code=406, reply-text=TIMEOUT WAITING FOR ACK, class-id=0, method-id=0)

最後に私のアプリケーションは接続できませんrabbitmq。 btw私のrabbitmqサーバはhealtyです。

+0

「私のアプリケーションは、接続RabbitMQのできない最終的には」明確にしてください - エラーは何ですか? –

+0

org.springframework.amqp.AmqpIOException:java.net.SocketException:破損したパイプ – Maple

答えて

0

send()RabbitTemplate.invoke()に入れて、template.waitForConfirmsOrDie()を長くしてタイムアウトを長くしてみてください。

invoke()を使用していて、それを行わない場合、フレームワークは確認のために5000msだけ待機します。

invoke()を使用していない場合、そのクローズエラーをどのように取得できるかは不明です。

+0

spring-rabbitmqの1.7.4.RELEASEバージョンのrabbitmqtemplateにはwaitforconfirmsordie()関数がありません。とにかく、この問題を解決するために、確認の内容を非同期操作に変更した方法が見つかりました – Maple

0
public void confirm(CorrelationData correlationData, boolean ack, String cause) { 
    long nowTime = System.nanoTime(); 
    String uuid = correlationData.getId(); 
    if (ack) { 
     orderMessageLogComponent.deleteOrderMessageLogByUUID(uuid); 
    } else { 
     log.error("消息发送失败,消息唯一标识为{},具体原因为{},当前时间为{}", uuid, cause, nowTime); 
    } 
} 

@Override 
@Async(MsgSendAsyncConfig.MSGSEND_SYNC_POOL) 
public void deleteOrderMessageLogByUUID(String uuid) { 
    orderMessageLogService.deleteOrderMessageLogByUUID(uuid); 
} 
0
org.springframework.amqp.AmqpIOException: java.net.SocketException: Broken pipe 
    at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:71) 
    at org.springframework.amqp.rabbit.connection.RabbitAccessor.convertRabbitAccessException(RabbitAccessor.java:113) 
    at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:1461) 
    at org.springframework.amqp.rabbit.core.RabbitTemplate.access$2400(RabbitTemplate.java:130) 
    at org.springframework.amqp.rabbit.core.RabbitTemplate$10.doWithRetry(RabbitTemplate.java:1398) 
    at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:286) 
    at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:179) 
    at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1394) 
    at org.springframework.amqp.rabbit.core.RabbitTemplate.send(RabbitTemplate.java:712) 
    at org.springframework.amqp.rabbit.core.RabbitTemplate.convertAndSend(RabbitTemplate.java:780) 
    at com.nubia.shop.order.component.impl.OrderStatusChangeComponentImpl.genOrderSuc(OrderStatusChangeComponentImpl.java:61) 
    at com.nubia.shop.order.checkout.CheckoutList.sendGenOrderMsg(CheckoutList.java:91) 
    at com.nubia.shop.order.service.impl.OrderServiceImpl.sendGenOrderRelateMsg(OrderServiceImpl.java:107) 
    at com.nubia.shop.order.service.impl.OrderServiceImpl$$FastClassBySpringCGLIB$$3ce15a2c.invoke(<generated>) 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.interceptor.AsyncExecutionInterceptor$1.call(AsyncExecutionInterceptor.java:115) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.net.SocketException: Broken pipe 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) 
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153) 
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) 
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:95) 
    at java.io.DataOutputStream.writeByte(DataOutputStream.java:153) 
    at com.rabbitmq.client.impl.Frame.writeTo(Frame.java:185) 
    at com.rabbitmq.client.impl.SocketFrameHandler.writeFrame(SocketFrameHandler.java:171) 
    at com.rabbitmq.client.impl.AMQConnection.writeFrame(AMQConnection.java:542) 
    at com.rabbitmq.client.impl.AMQCommand.transmit(AMQCommand.java:104) 
    at com.rabbitmq.client.impl.AMQChannel.quiescingTransmit(AMQChannel.java:337) 
    at com.rabbitmq.client.impl.AMQChannel.transmit(AMQChannel.java:313) 
    at com.rabbitmq.client.impl.ChannelN.basicPublish(ChannelN.java:686) 
    at com.rabbitmq.client.impl.ChannelN.basicPublish(ChannelN.java:668) 
    at org.springframework.amqp.rabbit.support.PublisherCallbackChannelImpl.basicPublish(PublisherCallbackChannelImpl.java:221) 
    at sun.reflect.GeneratedMethodAccessor619.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$CachedChannelInvocationHandler.invoke(CachingConnectionFactory.java:955) 
    at com.sun.proxy.$Proxy126.basicPublish(Unknown Source) 
    at org.springframework.amqp.rabbit.core.RabbitTemplate.doSend(RabbitTemplate.java:1532) 
    at org.springframework.amqp.rabbit.core.RabbitTemplate$3.doInRabbit(RabbitTemplate.java:716) 
    at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:1455) 
    ... 25 more 
関連する問題