2016-04-07 6 views
1

Ich benutze Camel und ich habe ein Problem, dass mehrere Instanzen des Defaultproducer plötzlich erstellt wird. Normalerweise wird beim Starten der Kamelroute nur eine Instanz des Producers wie erwartet erstellt. Aber nach einiger Zeit (Stunden) wird ein neuer Produzent instanziiert. Ich habe keine Ahnung, wie ich dieses Problem umgehen kann.Mehrere Instanzen von Default Producer in Camel erstellt

-Code für doStart der Erzeugerklasse:

@Override 
protected void doStart() throws Exception { 
    super.doStart(); 
    connect(); 
} 

Die connect() verwendet wird, um den Kanal mit Bootstrap zu verbinden. Da ein neuer Producer instanziiert wird, versucht er, sich mehrfach zu verbinden, wodurch die Route manchmal abstürzt.

private void connect() { 
    final ChannelFuture channelFuture = bootstrap.connect(); 
    channelFuture.addListener(new GenericFutureListener<ChannelFuture>() { 
     @Override 
     public void operationComplete(final ChannelFuture future) throws Exception { 
      if (!future.isSuccess()) { 
       LOG.info("Connection not successful. Cause: " + future.cause().toString() + " -> Reconnecting..."); 
       reconnect(future.channel()); 
      } else { 
       LOG.info("Connection successful."); 
      } 
     } 
    }); 
} 

Camel Route:

// Define heartbeat routes 
    for (final EndpointInfo endpointInfo : endpointInfos) { 
     final String uri = BOLD_ENDPOINT_PREFIX + endpointInfo.getUri(); 
     from("timer:monitor" + uri + "?fixedRate=true&period=" + (heartbeatInterval * 1000)) 
       .routeId(endpointInfo.getHeartbeatRouteId()) 
       .autoStartup(false) 
       .setBody(constant(HEARTBEAT_MSG)) 
       .doTry() 
        .to(uri) 
        .process(new HealthProcessor(endpointInfo, true)) 
       .doCatch(Throwable.class) 
        .process(new HealthProcessor(endpointInfo, false)) 
       .end(); 

     uris[index++] = uri; 
     routeIds[index] = endpointInfo.getHeartbeatRouteId(); 
    } 

    // Define event route 
    from("activemq:Queue.External?cacheLevelName=CACHE_CONSUMER&transacted=true") 
      .routeId("eventProcessing") 
      .autoStartup(false) 
      .log(LoggingLevel.DEBUG, "Event Received: ${id}") 
      .filter(new ConfigEventFilter()) 
      .filter(videoVerificationEventDisabled) 
      .filter(virtualAssistantEventDisabled) 
      .filter(eventBatchingDisabled) 
      .filter(liveInterventionEventDisabled) 
      .process(factory.createProducerTransformer()) 
      .loadBalance(new BoldLoadBalancer(endpointInfos)) 
      .to(uris); 

    // Set up heartbeat detector 
    heartbeatDetector.initialize(this, routeIds); 

Wie kann ein Hersteller instanziert werden, ohne es zu int eh erst gestoppt werden? Muss ich den Status des Dienstes irgendwo wissen?

Antwort

0

Etwas verwirrend, warum musst du das alles machen? Kannst du sagen, was dein Use Case ist und welche Rolle Camel spielt? ;)

+0

Dies ist eine Producer-Consumer-Anwendung. Ich benutze das Kamel, um die Routen zu definieren. Momentan richte ich eine einzelne Endpunkt-Route ein. Der Endpunkt startet den Produzenten, um die Nachrichten zu erzeugen und zu senden. Wenn eine Nachricht an den Endpunkt gesendet wird, markiere ich diesen Endpunkt als gesund. Der Befehl doStart() startet den Producer, der versucht, sich mit dem Endpunkt zu verbinden. Der doStart() des Producers wird nach ein paar Stunden wieder plötzlich aufgerufen. Aufgrund der Methode connect() in der doStart() -Methode versucht es, sich erneut zu verbinden, was zu Redundanz in Verbindungen führt, und ich kann keine Nachrichten an diesen Endpunkt übermitteln. – Shiva

+0

Können Sie Ihre Route posten? – gnanagurus

+0

Ich habe meinen Code so geändert, dass er Camel Route enthält. – Shiva