Java – postreceive on channel ‘outputchannel’, message is null

I have a spring integration application that uses the httprequesthandling messaging gateway to accept JSON requests, send them to the transformer, then the service activator, and then the pollablechannel receives and sends back messages

However, I received a response to the standby request, and I was running the application logger in trace mode, such as @ Gary Russell suggested on other issues and got the following stack trace

When deleting output channel from header richher, I received the following exception:

service activator . . .HolidaysAvailableResponse [holidayCodes=[HolidayCode [code=NEW-YEARS-DAY-ACTUAL,description=New Year's Day],HolidayCode [code=NEW-YEARS-DAY-OBSERVED,HolidayCode [code=DAY-AFTER-NEW-YEARS-DAY,description=Day After New Year's Day (QC)],HolidayCode [code=EPIPHANY,description=Epiphany],HolidayCode [code=QUEBEC-FLAG-DAY,description=Quebec Flag Day],HolidayCode [code=GROUNDHOG-DAY,description=Groundhog Day],HolidayCode [code=VALENTINES-DAY,description=Valentine's Day],HolidayCode [code=FLAG-DAY,description=Flag Day],HolidayCode [code=ISLANDER-DAY,description=Islander Day (PE)],HolidayCode [code=HERITAGE-DAY-YT,description=Heritage Day (YT)],HolidayCode [code=LOUIS-RIEL-DAY,description=Louis Riel Day (MB)],HolidayCode [code=FAMILY-DAY,description=Family Day (AB,ON,SK)],HolidayCode [code=ST-PATRICKS-DAY-ACTUAL,description=St. Patrick's Day],HolidayCode [code=ST-PATRICKS-DAY-OBSERVED,description=St. Patrick's Day (NL)],HolidayCode [code=COMMONWEALTH-DAY,description=Commonwealth Day],HolidayCode [code=EASTER-ACTUAL,description=Easter Sunday],HolidayCode [code=EASTER-OBSERVED,description=Easter Monday],HolidayCode [code=GOOD-FRIDAY,description=Good Friday],HolidayCode [code=SHROVE-TUESDAY,description=Shrove Tuesday (Pancake Day)],HolidayCode [code=ASH-WEDNESDAY,description=Ash Wednesday],HolidayCode [code=PALM-SUNDAY,description=Palm Sunday],HolidayCode [code=MAUNDY-THURSDAY,description=Maundy Thursday],HolidayCode [code=VIMY-RIDGE-DAY,description=Vimy Ridge Day],HolidayCode [code=VICTORIA-DAY,description=Victoria Day],HolidayCode [code=NATIONAL-PATRIOTES-DAY,description=National Patriotes Day (QC)],HolidayCode [code=NATIONAL-ABORIGINAL-DAY-ACTUAL,description=National Aboriginal Day (NT)],HolidayCode [code=NATIONAL-ABORIGINAL-DAY-OBSERVED,HolidayCode [code=NATIONAL-DAY-ACTUAL,description=National Day (QC)],HolidayCode [code=NATIONAL-DAY-OBSERVED,HolidayCode [code=CANADA-DAY-ACTUAL,description=Canada Day],HolidayCode [code=CANADA-DAY-OBSERVED,HolidayCode [code=NUNAVUT-DAY-ACTUAL,description=Nunavut Day],HolidayCode [code=NUNAVUT-DAY-OBSERVED,HolidayCode [code=BRITISH-COLUMBIA-DAY,description=British Columbia Day (BC)],HolidayCode [code=HERITAGE-DAY-AB,description=Heritage Day (AB)],HolidayCode [code=CIVIC-HOLIDAY,description=Civic Holiday (MB,NT,HolidayCode [code=NEW-BRUNSWICK-DAY,description=New Brunswick Day (NB)],HolidayCode [code=GOLD-CUP-PARADE-DAY,description=Gold Cup Parade (PE)],HolidayCode [code=LABOUR-DAY,description=Labour Day],HolidayCode [code=THANKSGIVING-DAY,description=Thanksgiving Day],HolidayCode [code=HALLOWEEN,description=Halloween],HolidayCode [code=REMEMBERANCE-DAY-ACTUAL,description=Rememberance Day],HolidayCode [code=REMEMBERANCE-DAY-OBSERVED,HolidayCode [code=CHRISTMAS-ACTUAL,description=Christmas],HolidayCode [code=CHRISTMAS-OBSERVED,HolidayCode [code=@R_590_2419@ING-DAY-ACTUAL,description=@R_590_2419@ing Day],HolidayCode [code=@R_590_2419@ING-DAY-OBSERVED,HolidayCode [code=NEW-YEARS-EVE,description=New Year's Eve]]]
DEBUG 2016-05-31 19:47:42,976 [http-bio-8088-exec-4] (AbstractMessageHandler.java:72) (handleMessage) - org.springframework.integration.transformer.MessageTransformingHandler#0 received message: GenericMessage [payload=HolidaysAvailableResponse [holidayCodes=[HolidayCode [code=NEW-YEARS-DAY-ACTUAL,description=New Year's Eve]]],headers={timestamp=1464704262960,id=b8e76d8a-97f7-c7a6-0c7a-a58d3c2ce440}]
DEBUG 2016-05-31 19:47:42,976 [http-bio-8088-exec-4] (MessagingGatewaySupport.java:365) (doSendAndReceive) - failure occurred in gateway sendAndReceive: ; nested exception is org.springframework.integration.dispatcher.AggregateMessageDeliveryException: All attempts to deliver Message to MessageHandlers Failed.; nested exception is org.springframework.messaging.MessagingException: ; nested exception is org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available. Multiple causes:
    ; nested exception is org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available
    ; nested exception is org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available
See below for the stacktrace of the first cause.
DEBUG 2016-05-31 19:47:42,976 [http-bio-8088-exec-4] (AbstractHandlerExceptionResolver.java:134) (resolveException) - Resolving exception from handler [httpGatewayPost]: org.springframework.messaging.MessageHandlingException: ; nested exception is org.springframework.integration.dispatcher.AggregateMessageDeliveryException: All attempts to deliver Message to MessageHandlers Failed.; nested exception is org.springframework.messaging.MessagingException: ; nested exception is org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available. Multiple causes:
    ; nested exception is org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available
    ; nested exception is org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available
See below for the stacktrace of the first cause.
DEBUG 2016-05-31 19:47:42,976 [http-bio-8088-exec-4] (AbstractHandlerExceptionResolver.java:134) (resolveException) - Resolving exception from handler [httpGatewayPost]: org.springframework.messaging.MessageHandlingException: ; nested exception is org.springframework.integration.dispatcher.AggregateMessageDeliveryException: All attempts to deliver Message to MessageHandlers Failed.; nested exception is org.springframework.messaging.MessagingException: ; nested exception is org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available. Multiple causes:
    ; nested exception is org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available
    ; nested exception is org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available
See below for the stacktrace of the first cause.
TRACE 2016-05-31 19:47:42,976 [http-bio-8088-exec-4] (FrameworkServlet.java:1058) (resetContextHolders) - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@4106a123
DEBUG 2016-05-31 19:47:42,976 [http-bio-8088-exec-4] (FrameworkServlet.java:989) (processRequest) - Could not complete request
org.springframework.messaging.MessageHandlingException: ; nested exception is org.springframework.integration.dispatcher.AggregateMessageDeliveryException: All attempts to deliver Message to MessageHandlers Failed.; nested exception is org.springframework.messaging.MessagingException: ; nested exception is org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available. Multiple causes:
    ; nested exception is org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available
    ; nested exception is org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available
See below for the stacktrace of the first cause.
    at org.springframework.integration.handler.MethodInvokingMessageProcessor.processMessage(MethodInvokingMessageProcessor.java:78)
    at org.springframework.integration.handler.ServiceActivatingHandler.handleRequestMessage(ServiceActivatingHandler.java:71)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:99)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78)
    at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:101)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:97)
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:277)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSendAndReceive(GenericMessagingTemplate.java:150)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSendAndReceive(GenericMessagingTemplate.java:45)
    at org.springframework.messaging.core.AbstractMessagingTemplate.sendAndReceive(AbstractMessagingTemplate.java:42)
    at org.springframework.integration.gateway.MessagingGatewaySupport.doSendAndReceive(MessagingGatewaySupport.java:357)
    at org.springframework.integration.gateway.MessagingGatewaySupport.sendAndReceiveMessage(MessagingGatewaySupport.java:328)
    at org.springframework.integration.http.inbound.HttpRequestHandlingEndpointSupport.actualDoHandleRequest(HttpRequestHandlingEndpointSupport.java:492)
    at org.springframework.integration.http.inbound.HttpRequestHandlingEndpointSupport.doHandleRequest(HttpRequestHandlingEndpointSupport.java:389)
    at org.springframework.integration.http.inbound.HttpRequestHandlingMessagingGateway.handleRequest(HttpRequestHandlingMessagingGateway.java:103)
    at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:51)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)

Solution

I don't understand what's going on:

DEBUG 2016-05-29 23:31:35,681 [http-bio-8080-exec-3] (AbstractMessageChannel.java:383) (postSend) - postSend (sent=true) on channel 'outputChannel',message: GenericMessage [payload=HolidaysAvailableResponse [holidayCodes=[HolidayCode [code=NEW-YEARS-DAY-ACTUAL. . .(POJO),headers={content-type=application/json,id=da43d6d2-2618-8581-4fcc-6aff7e79b6e1,timestamp=1464544895681}]
...
TRACE 2016-05-29 23:31:35,807 [http-bio-8080-exec-3] (AbstractMessageChannel.java:426) (postReceive) - postReceive on channel 'outputChannel',message is null

Unless another thread (not logging) consumes from the outputchannel or has two "outputchannel" beans in some way - this should not be possible

In other words, this code is strange

@ServiceActivator(inputChannel = "requestChannel")
public Message<?> echo(Message<String> message)
{
    // log.info("request :: " + message.getPayload());

    jsonToObjectTransformerChannel.send(message);
    // inputChannel.send(message);

    Message<?> responseMessage = outputChannel.receive(100);

    System.out.println("final response recieved :: ");
    System.out.println(responseMessage);

    return responseMessage;
}

This is not really intended to send and receive messages with such a service activator (although it should not cause any problems)

I'm interested to know what happens if you get rid of the outputchannel and delete the output channel from it

<header-enricher input-channel="headerEnricherChannel">
    <header name="content-type" value="application/json" />
</header-enricher>

And simply connect the requestchannel to the JSON object converter

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>