1

にfallbackMethodを呼び出していないが、AMQPブローカー(RabbitMQのを)始めた が、私のフェールオーバーの方法があります決して呼び出されません。@HystrixCommand私は@EnableCircuitBreaker</p> <p>と私の@SpringBootApplicationを注釈付き以外でフェイルオーバーを試してみたいしているバネの統合@InboundChannelAdapter

どのようなアイデアですか?

package demo.sources.time; 

import java.text.SimpleDateFormat; 
import java.util.Date; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.boot.context.properties.EnableConfigurationProperties; 
import org.springframework.cloud.stream.annotation.EnableBinding; 
import org.springframework.cloud.stream.messaging.Source; 
import org.springframework.integration.annotation.InboundChannelAdapter; 

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; 

import demo.common.dto.HelloDTO; 
import demo.sources.configs.TimeSourceOptionsMetadata; 

@EnableBinding(Source.class) 
@EnableConfigurationProperties(TimeSourceOptionsMetadata.class) 
public class TimeSource { 
    private static final Logger logger = LoggerFactory.getLogger(TimeSource.class); 

    @Value("${app.info.instance_index}") 
    private String instanceIndex; 

    @Autowired 
    private TimeSourceOptionsMetadata timeSourceOptionsMetadata; 

    @InboundChannelAdapter(value = Source.OUTPUT) 
    @HystrixCommand(fallbackMethod = "fallbackTimerMessageSource") 
    public HelloDTO timerMessageSource() { 
     HelloDTO helloDTO = new HelloDTO(); 
     helloDTO.name = new SimpleDateFormat(this.timeSourceOptionsMetadata.getFormat()).format(new Date()); 
     logger.info("[{}]Produced: '{}'", instanceIndex, helloDTO); 
     return helloDTO; 
    } 

    public HelloDTO fallbackTimerMessageSource() { 
     logger.error("Hystrix fallbackTimerMessageSource handled exception.") 
     return new HelloDTO(); 
    } 
} 

スタックトレースは次のとおりです。あなたのStackTrace(at org.springframework.integration.amqp.outbound.AmqpOutboundEndpoint.send)によると、問題が遠くtimerMessageSource()法からすでにある

2017-07-10 22:26:52.212 INFO 78432 --- [hystrix-TimeSource$$EnhancerBySpringCGLIB$$38c7b153-1]  demo.sources.time.TimeSource    : [0]Produced: 'Hello 2017-07-10 22:26:52!' 
2017-07-10 22:26:52.302 ERROR 78432 --- [task-scheduler-1] o.s.integration.handler.LoggingHandler :  org.springframework.messaging.MessageHandlingException: error occurred in message handler  [org[email protected]317fa27f]; nested exception is  org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused (Connection refused),  failedMessage=GenericMessage [payload=byte[49], headers={id=19675fd6-5e64-fcbe-9ee1-33eeec3b25e1, contentType=text/plain,  originalContentType=application/json;charset=UTF-8, timestamp=1499718412291}] 
     at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:139) 
     <snip> 
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) 
     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) 
     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:748) 
Caused by: org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused (Connection refused) 
     at  org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java :62) 
     at  org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:368) 
     at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:565) 
     at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:1430) 
     at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1411) 
     at org.springframework.amqp.rabbit.core.RabbitTemplate.send(RabbitTemplate.java:712) 
     at org.springframework.integration.amqp.outbound.AmqpOutboundEndpoint.send(AmqpOutboundEndpoint.java:134) 
     at org.springframework.integration.amqp.outbound.AmqpOutboundEndpoint.handleRequestMessage(AmqpOutboundEndpoint.java:122) 
     at  org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMess ageHandler.java:109) 
     at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127) 
     ... 30 more 
Caused by: java.net.ConnectException: Connection refused (Connection refused) 
     at java.net.PlainSocketImpl.socketConnect(Native Method) 
     at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
     at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
     at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
     at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
     at java.net.Socket.connect(Socket.java:589) 
     at com.rabbitmq.client.impl.SocketFrameHandlerFactory.create(SocketFrameHandlerFactory.java:50) 
     at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:907) 
     at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:859) 
     at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:1000) 
     at  org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:356) 
     ... 38 more 

答えて

0

私は直接メッセージチャネルを注入し、その送信方法使用して、その周りになった:つまり

@EnableBinding(Source.class) 
@EnableConfigurationProperties(TimeSourceOptionsMetadata.class) 
public class TimeSource { 
    private static final Logger logger = LoggerFactory.getLogger(TimeSource.class); 

    @Value("${app.info.instance_index}") 
    private String instanceIndex; 

    @Autowired 
    private TimeSourceOptionsMetadata timeSourceOptionsMetadata; 

    @Autowired 
    @Qualifier(Source.OUTPUT) 
    private MessageChannel outputMessageChannel; 

    /** with using the injected MessageHeaders and wrapping with a Hystrix CircuitBreaker */ 
    @Scheduled(fixedDelay = 2500, initialDelay = 500) 
    @HystrixCommand(fallbackMethod = "fallbackTimerMessageSource") 
    public void timerMessageSource() { 
     HelloDTO helloDTO = new HelloDTO(); 
     helloDTO.name = new SimpleDateFormat(this.timeSourceOptionsMetadata.getFormat()).format(new Date()); 
     logger.info("[{}]Produced: '{}'", instanceIndex, helloDTO); 
     Message<HelloDTO> theMessage = MessageBuilder.withPayload(helloDTO).setHeader(MessageHeaders.CONTENT_TYPE, "application/json") 
        .build(); 
     outputMessageChannel.send(theMessage, 1000l); 
    } 

    public void fallbackTimerMessageSource(Throwable t) { 
     logger.error("Hystrix fallbackTimerMessageSource handle exception. The original exception was {}", t.getMessage()); 
     Throwable cause = t.getCause(); 
     logger.error("Exception cause was: {} {}", (cause == null ? "null" : cause.getClass().getName()), 
        (cause == null ? "null" : cause.getMessage())); 
    } 
} 
1

具体的には、AmqpOutboundEndpointにはAbstractRequestHandlerAdviceを実装することを検討する必要があります。 Reference Manualにある問題のドキュメント。

そして、すべての仕組みを示すためにsome sampleがあります。

+0

を、timerMessageSource '()の呼び出しが'成功しました。失敗したメッセージを含むダウンストリーム呼び出しです。 –

+0

ここに外部の回路ブレーカを設置することも意味がありますか? – spencergibb

関連する問題