2015-09-21 16 views
1

我有兩個應用程序運行ActiveMQ代理的任一端;應用1發送同步請求的應用程序2,該返回響應發回應用程序1.Spring集成的併發問題 - 「無法發佈到已刪除的目標」

應用1

@MessagingGateway 
public interface OrderGateway { 

    @Gateway(requestChannel = "requestChannel", replyChannel = "responseChannel") 
    public OrderDto fetchOrder(OrderRequest orderRequest); 
} 

@Bean 
public IntegrationFlow outgoingRequestFlow(ConnectionFactory connectionFactory) { 

    return IntegrationFlows.from("requestChannel") 
          .handle(Jms.outboundGateway(connectionFactory).requestDestination("order.queue")) 
          .get(); 
} 

應用2

@Bean 
public IntegrationFlow incomingRequestFlow(ConnectionFactory connectionFactory) { 

    return IntegrationFlows.from(Jms.inboundGateway(connectionFactory).destination("order.queue")) 
          .channel("requestChannel") 
          .handle("orderServiceActivator", "fetchOrder") 
          .channel("responseChannel") 
          .get(); 
} 

@Component 
public class OrderServiceActivator { 

    @Autowired 
    OrderService orderService; 

    @ServiceActivator 
    public OrderDto fetchOrder(OrderRequest orderRequest) { 

     return orderService.getById(orderRequest.getId()); 
    } 
} 

這兩個應用程序包含以下代理連接出廠配置:

@Bean(destroyMethod = "stop") 
public PooledConnectionFactory activeMQConnectionFactory() { 

    ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(); 
    activeMQConnectionFactory.setBrokerURL("tcp://broker.local:61616"); 

    return new PooledConnectionFactory(activeMQConnectionFactory); 
} 

我在應用程序1 /myapp/order/{id}中創建了一個REST控制器,它向orderGateway.fetchOrder提交請求,該請求正常工作。然後我通過在命令行運行while true; do curl http://localhost:8080/myapp/order/1; done來測試它,並讓它運行幾分鐘,通過應用發送了數百個請求,沒有錯誤,一切都很好。我可以看到,request.queue正在排隊和出隊消息在ActiveMQ管理工具中,並且ActiveMQ.Advisory.TempQueue也有很高的排隊/出隊計數。

當有併發請求時會發生問題;如果我打開了兩個終端窗口,並運行在兩個窗口捲曲環,很快我開始看到以下錯誤:

Sep 21, 2015 4:35:25 PM org.springframework.jms.listener.DefaultMessageListenerContainer invokeErrorHandler 
WARNING: Execution of JMS message listener failed, and no ErrorHandler has been set. 
javax.jms.InvalidDestinationException: Cannot publish to a deleted Destination: temp-queue://ID:Stans-MacBook-Pro.local-64816-1442849675850-1:1:559 

是我SI配置錯了嗎?是否需要應用其他一些配置參數?感謝您的任何指導。

回答

1

我需要看到雙方的調試日誌,找出發生了什麼 - 它意味着客戶端已超時;但是,默認的超時時間是5秒。您可以增加出站網關上的receiveTimeout

也就是說,通常最好使用一個指定的回覆目標,以避免爲每個請求創建一個臨時回覆隊列。請記住,同樣的超時也適用於那裏。

+0

感謝您的回覆Gary。我將專注於創建一個指定的答覆目的地,以查看錯誤是否仍然存在。我已經爲此創建了一個單獨的問題,而不是編輯這個問題。 –