001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.camel; 018 019 import java.io.IOException; 020 import java.io.InputStream; 021 import java.util.Collection; 022 import java.util.List; 023 import java.util.Map; 024 import java.util.Properties; 025 import java.util.concurrent.ScheduledExecutorService; 026 import java.util.concurrent.TimeUnit; 027 028 import org.apache.camel.builder.ErrorHandlerBuilder; 029 import org.apache.camel.model.DataFormatDefinition; 030 import org.apache.camel.model.RouteDefinition; 031 import org.apache.camel.model.RoutesDefinition; 032 import org.apache.camel.spi.CamelContextNameStrategy; 033 import org.apache.camel.spi.ClassResolver; 034 import org.apache.camel.spi.DataFormat; 035 import org.apache.camel.spi.DataFormatResolver; 036 import org.apache.camel.spi.Debugger; 037 import org.apache.camel.spi.EndpointStrategy; 038 import org.apache.camel.spi.ExecutorServiceManager; 039 import org.apache.camel.spi.FactoryFinder; 040 import org.apache.camel.spi.FactoryFinderResolver; 041 import org.apache.camel.spi.InflightRepository; 042 import org.apache.camel.spi.Injector; 043 import org.apache.camel.spi.InterceptStrategy; 044 import org.apache.camel.spi.Language; 045 import org.apache.camel.spi.LifecycleStrategy; 046 import org.apache.camel.spi.ManagementMBeanAssembler; 047 import org.apache.camel.spi.ManagementNameStrategy; 048 import org.apache.camel.spi.ManagementStrategy; 049 import org.apache.camel.spi.NodeIdFactory; 050 import org.apache.camel.spi.PackageScanClassResolver; 051 import org.apache.camel.spi.ProcessorFactory; 052 import org.apache.camel.spi.Registry; 053 import org.apache.camel.spi.RouteStartupOrder; 054 import org.apache.camel.spi.RuntimeEndpointRegistry; 055 import org.apache.camel.spi.ServicePool; 056 import org.apache.camel.spi.ShutdownStrategy; 057 import org.apache.camel.spi.StreamCachingStrategy; 058 import org.apache.camel.spi.TypeConverterRegistry; 059 import org.apache.camel.spi.UnitOfWorkFactory; 060 import org.apache.camel.spi.UuidGenerator; 061 import org.apache.camel.util.LoadPropertiesException; 062 063 /** 064 * Interface used to represent the context used to configure routes and the 065 * policies to use during message exchanges between endpoints. 066 * <p/> 067 * The context offers the following methods to control the lifecycle: 068 * <ul> 069 * <li>{@link #start()} - to start (<b>important:</b> the start method is not blocked, see more details 070 * <a href="http://camel.apache.org/running-camel-standalone-and-have-it-keep-running.html">here</a>)</li> 071 * <li>{@link #stop()} - to shutdown (will stop all routes/components/endpoints etc and clear internal state/cache)</li> 072 * <li>{@link #suspend()} - to pause routing messages</li> 073 * <li>{@link #resume()} - to resume after a suspend</li> 074 * </ul> 075 * <p/> 076 * <b>Notice:</b> {@link #stop()} and {@link #suspend()} will gracefully stop/suspend routes ensuring any messages 077 * in progress will be given time to complete. See more details at {@link org.apache.camel.spi.ShutdownStrategy}. 078 * <p/> 079 * If you are doing a hot restart then it's advised to use the suspend/resume methods which ensure a faster 080 * restart but also allows any internal state to be kept as is. 081 * The stop/start approach will do a <i>cold</i> restart of Camel, where all internal state is reset. 082 * <p/> 083 * End users are advised to use suspend/resume. Using stop is for shutting down Camel and it's not guaranteed that 084 * when it's being started again using the start method that Camel will operate consistently. 085 * 086 * @version 087 */ 088 public interface CamelContext extends SuspendableService, RuntimeConfiguration { 089 090 /** 091 * Starts the {@link CamelContext} (<b>important:</b> the start method is not blocked, see more details 092 * <a href="http://camel.apache.org/running-camel-standalone-and-have-it-keep-running.html">here</a>)</li>. 093 * <p/> 094 * See more details at the class-level javadoc of this class. 095 * 096 * @throws Exception is thrown if starting failed 097 */ 098 void start() throws Exception; 099 100 /** 101 * Stop and shutdown the {@link CamelContext} (will stop all routes/components/endpoints etc and clear internal state/cache). 102 * <p/> 103 * See more details at the class-level javadoc of this class. 104 * 105 * @throws Exception is thrown if stopping failed 106 */ 107 void stop() throws Exception; 108 109 /** 110 * Gets the name (id) of the this context. 111 * 112 * @return the name 113 */ 114 String getName(); 115 116 /** 117 * Gets the current name strategy 118 * 119 * @return name strategy 120 */ 121 CamelContextNameStrategy getNameStrategy(); 122 123 /** 124 * Sets a custom name strategy 125 * 126 * @param nameStrategy name strategy 127 */ 128 void setNameStrategy(CamelContextNameStrategy nameStrategy); 129 130 /** 131 * Gets the current management name strategy 132 * 133 * @return management name strategy 134 */ 135 ManagementNameStrategy getManagementNameStrategy(); 136 137 /** 138 * Sets a custom management name strategy 139 * 140 * @param nameStrategy name strategy 141 */ 142 void setManagementNameStrategy(ManagementNameStrategy nameStrategy); 143 144 /** 145 * Gets the name this {@link CamelContext} was registered in JMX. 146 * <p/> 147 * The reason that a {@link CamelContext} can have a different name in JMX is the fact to remedy for name clash 148 * in JMX when having multiple {@link CamelContext}s in the same JVM. Camel will automatic reassign and use 149 * a free name to avoid failing to start. 150 * 151 * @return the management name 152 */ 153 String getManagementName(); 154 155 /** 156 * Gets the version of the this context. 157 * 158 * @return the version 159 */ 160 String getVersion(); 161 162 /** 163 * Get the status of this context 164 * 165 * @return the status 166 */ 167 ServiceStatus getStatus(); 168 169 /** 170 * Gets the uptime in a human readable format 171 * 172 * @return the uptime in days/hours/minutes 173 */ 174 String getUptime(); 175 176 // Service Methods 177 //----------------------------------------------------------------------- 178 179 /** 180 * Adds a service to this context, which allows this context to control the lifecycle, ensuring 181 * the service is stopped when the context stops. 182 * <p/> 183 * The service will also have {@link CamelContext} injected if its {@link CamelContextAware}. 184 * The service will also be enlisted in JMX for management (if JMX is enabled). 185 * The service will be started, if its not already started. 186 * 187 * @param object the service 188 * @throws Exception can be thrown when starting the service 189 */ 190 void addService(Object object) throws Exception; 191 192 /** 193 * Removes a service from this context. 194 * <p/> 195 * The service is assumed to have been previously added using {@link #addService(Object)} method. 196 * This method will <b>not</b> change the service lifecycle. 197 * 198 * @param object the service 199 * @throws Exception can be thrown if error removing the service 200 * @return <tt>true</tt> if the service was removed, <tt>false</tt> if no service existed 201 */ 202 boolean removeService(Object object) throws Exception; 203 204 /** 205 * Has the given service already been added to this context? 206 * 207 * @param object the service 208 * @return <tt>true</tt> if already added, <tt>false</tt> if not. 209 */ 210 boolean hasService(Object object); 211 212 /** 213 * Adds the given listener to be invoked when {@link CamelContext} have just been started. 214 * <p/> 215 * This allows listeners to do any custom work after the routes and other services have been started and are running. 216 * <p/><b>Important:</b> The listener will always be invoked, also if the {@link CamelContext} has already been 217 * started, see the {@link org.apache.camel.StartupListener#onCamelContextStarted(CamelContext, boolean)} method. 218 * 219 * @param listener the listener 220 * @throws Exception can be thrown if {@link CamelContext} is already started and the listener is invoked 221 * and cause an exception to be thrown 222 */ 223 void addStartupListener(StartupListener listener) throws Exception; 224 225 // Component Management Methods 226 //----------------------------------------------------------------------- 227 228 /** 229 * Adds a component to the context. 230 * 231 * @param componentName the name the component is registered as 232 * @param component the component 233 */ 234 void addComponent(String componentName, Component component); 235 236 /** 237 * Is the given component already registered? 238 * 239 * @param componentName the name of the component 240 * @return the registered Component or <tt>null</tt> if not registered 241 */ 242 Component hasComponent(String componentName); 243 244 /** 245 * Gets a component from the context by name. 246 * 247 * @param componentName the name of the component 248 * @return the component 249 */ 250 Component getComponent(String componentName); 251 252 /** 253 * Gets a component from the context by name. 254 * 255 * @param name the name of the component 256 * @param autoCreateComponents whether or not the component should 257 * be lazily created if it does not already exist 258 * @return the component 259 */ 260 Component getComponent(String name, boolean autoCreateComponents); 261 262 /** 263 * Gets a component from the context by name and specifying the expected type of component. 264 * 265 * @param name the name to lookup 266 * @param componentType the expected type 267 * @return the component 268 */ 269 <T extends Component> T getComponent(String name, Class<T> componentType); 270 271 /** 272 * Gets a readonly list of names of the components currently registered 273 * 274 * @return a readonly list with the names of the the components 275 */ 276 List<String> getComponentNames(); 277 278 /** 279 * Removes a previously added component. 280 * <p/> 281 * The component being removed will be stopped first. 282 * 283 * @param componentName the component name to remove 284 * @return the previously added component or null if it had not been previously added. 285 */ 286 Component removeComponent(String componentName); 287 288 // Endpoint Management Methods 289 //----------------------------------------------------------------------- 290 291 /** 292 * Resolves the given name to an {@link Endpoint} of the specified type. 293 * If the name has a singleton endpoint registered, then the singleton is returned. 294 * Otherwise, a new {@link Endpoint} is created and registered. 295 * 296 * @param uri the URI of the endpoint 297 * @return the endpoint 298 */ 299 Endpoint getEndpoint(String uri); 300 301 /** 302 * Resolves the given name to an {@link Endpoint} of the specified type. 303 * If the name has a singleton endpoint registered, then the singleton is returned. 304 * Otherwise, a new {@link Endpoint} is created and registered. 305 * 306 * @param name the name of the endpoint 307 * @param endpointType the expected type 308 * @return the endpoint 309 */ 310 <T extends Endpoint> T getEndpoint(String name, Class<T> endpointType); 311 312 /** 313 * Returns the collection of all registered endpoints. 314 * 315 * @return all endpoints 316 */ 317 Collection<Endpoint> getEndpoints(); 318 319 /** 320 * Returns a new Map containing all of the active endpoints with the key of the map being their 321 * unique key. 322 * 323 * @return map of active endpoints 324 */ 325 Map<String, Endpoint> getEndpointMap(); 326 327 /** 328 * Is the given endpoint already registered? 329 * 330 * @param uri the URI of the endpoint 331 * @return the registered endpoint or <tt>null</tt> if not registered 332 */ 333 Endpoint hasEndpoint(String uri); 334 335 /** 336 * Adds the endpoint to the context using the given URI. 337 * 338 * @param uri the URI to be used to resolve this endpoint 339 * @param endpoint the endpoint to be added to the context 340 * @return the old endpoint that was previously registered or <tt>null</tt> if none was registered 341 * @throws Exception if the new endpoint could not be started or the old endpoint could not be stopped 342 */ 343 Endpoint addEndpoint(String uri, Endpoint endpoint) throws Exception; 344 345 /** 346 * Removes all endpoints with the given URI. 347 * <p/> 348 * The endpoints being removed will be stopped first. 349 * 350 * @param pattern an uri or pattern to match 351 * @return a collection of endpoints removed which could be empty if there are no endpoints found for the given <tt>pattern</tt> 352 * @throws Exception if at least one endpoint could not be stopped 353 * @see org.apache.camel.util.EndpointHelper#matchEndpoint(CamelContext, String, String) for pattern 354 */ 355 Collection<Endpoint> removeEndpoints(String pattern) throws Exception; 356 357 /** 358 * Registers a {@link org.apache.camel.spi.EndpointStrategy callback} to allow you to do custom 359 * logic when an {@link Endpoint} is about to be registered to the {@link CamelContext} endpoint registry. 360 * <p/> 361 * When a callback is added it will be executed on the already registered endpoints allowing you to catch-up 362 * 363 * @param strategy callback to be invoked 364 */ 365 void addRegisterEndpointCallback(EndpointStrategy strategy); 366 367 // Route Management Methods 368 //----------------------------------------------------------------------- 369 370 /** 371 * Method to signal to {@link CamelContext} that the process to initialize setup routes is in progress. 372 * 373 * @param done <tt>false</tt> to start the process, call again with <tt>true</tt> to signal its done. 374 * @see #isSetupRoutes() 375 */ 376 void setupRoutes(boolean done); 377 378 /** 379 * Returns a list of the current route definitions 380 * 381 * @return list of the current route definitions 382 * @deprecated use {@link org.apache.camel.model.ModelCamelContext#getRouteDefinitions()} 383 */ 384 @Deprecated 385 List<RouteDefinition> getRouteDefinitions(); 386 387 /** 388 * Gets the route definition with the given id 389 * 390 * @param id id of the route 391 * @return the route definition or <tt>null</tt> if not found 392 * @deprecated use {@link org.apache.camel.model.ModelCamelContext#getRouteDefinition(String)} 393 */ 394 @Deprecated 395 RouteDefinition getRouteDefinition(String id); 396 397 /** 398 * Returns the order in which the route inputs was started. 399 * <p/> 400 * The order may not be according to the startupOrder defined on the route. 401 * For example a route could be started manually later, or new routes added at runtime. 402 * 403 * @return a list in the order how routes was started 404 */ 405 List<RouteStartupOrder> getRouteStartupOrder(); 406 407 /** 408 * Returns the current routes in this context 409 * 410 * @return the current routes 411 */ 412 List<Route> getRoutes(); 413 414 /** 415 * Gets the route with the given id 416 * 417 * @param id id of the route 418 * @return the route or <tt>null</tt> if not found 419 */ 420 Route getRoute(String id); 421 422 /** 423 * Adds a collection of routes to this context using the given builder 424 * to build them. 425 * <p/> 426 * <b>Important:</b> The added routes will <b>only</b> be started, if {@link CamelContext} 427 * is already started. You may want to check the state of {@link CamelContext} before 428 * adding the routes, using the {@link org.apache.camel.CamelContext#getStatus()} method. 429 * <p/> 430 * <b>Important: </b> Each route in the same {@link org.apache.camel.CamelContext} must have an <b>unique</b> route id. 431 * If you use the API from {@link org.apache.camel.CamelContext} or {@link org.apache.camel.model.ModelCamelContext} to add routes, then any 432 * new routes which has a route id that matches an old route, then the old route is replaced by the new route. 433 * 434 * @param builder the builder which will create the routes and add them to this context 435 * @throws Exception if the routes could not be created for whatever reason 436 */ 437 void addRoutes(RoutesBuilder builder) throws Exception; 438 439 /** 440 * Loads a collection of route definitions from the given {@link java.io.InputStream}. 441 * 442 * @param is input stream with the route(s) definition to add 443 * @throws Exception if the route definitions could not be loaded for whatever reason 444 * @return the route definitions 445 * @deprecated use {@link org.apache.camel.model.ModelCamelContext#loadRoutesDefinition(java.io.InputStream)} 446 */ 447 @Deprecated 448 RoutesDefinition loadRoutesDefinition(InputStream is) throws Exception; 449 450 /** 451 * Adds a collection of route definitions to the context 452 * 453 * @param routeDefinitions the route(s) definition to add 454 * @throws Exception if the route definitions could not be created for whatever reason 455 * @deprecated use {@link org.apache.camel.model.ModelCamelContext#addRouteDefinitions(java.util.Collection)} 456 */ 457 @Deprecated 458 void addRouteDefinitions(Collection<RouteDefinition> routeDefinitions) throws Exception; 459 460 /** 461 * Add a route definition to the context 462 * 463 * @param routeDefinition the route definition to add 464 * @throws Exception if the route definition could not be created for whatever reason 465 * @deprecated use {@link org.apache.camel.model.ModelCamelContext#addRouteDefinition(org.apache.camel.model.RouteDefinition)} 466 */ 467 @Deprecated 468 void addRouteDefinition(RouteDefinition routeDefinition) throws Exception; 469 470 /** 471 * Removes a collection of route definitions from the context - stopping any previously running 472 * routes if any of them are actively running 473 * 474 * @param routeDefinitions route(s) definitions to remove 475 * @throws Exception if the route definitions could not be removed for whatever reason 476 * @deprecated use {@link org.apache.camel.model.ModelCamelContext#removeRouteDefinitions(java.util.Collection)} 477 */ 478 @Deprecated 479 void removeRouteDefinitions(Collection<RouteDefinition> routeDefinitions) throws Exception; 480 481 /** 482 * Removes a route definition from the context - stopping any previously running 483 * routes if any of them are actively running 484 * 485 * @param routeDefinition route definition to remove 486 * @throws Exception if the route definition could not be removed for whatever reason 487 * @deprecated use {@link org.apache.camel.model.ModelCamelContext#removeRouteDefinition(org.apache.camel.model.RouteDefinition)} 488 */ 489 @Deprecated 490 void removeRouteDefinition(RouteDefinition routeDefinition) throws Exception; 491 492 /** 493 * Starts the given route if it has been previously stopped 494 * 495 * @param route the route to start 496 * @throws Exception is thrown if the route could not be started for whatever reason 497 * @deprecated use {@link org.apache.camel.model.ModelCamelContext#startRoute(org.apache.camel.model.RouteDefinition)} 498 */ 499 @Deprecated 500 void startRoute(RouteDefinition route) throws Exception; 501 502 /** 503 * Starts all the routes which currently is not started. 504 * 505 * @throws Exception is thrown if a route could not be started for whatever reason 506 */ 507 void startAllRoutes() throws Exception; 508 509 /** 510 * Starts the given route if it has been previously stopped 511 * 512 * @param routeId the route id 513 * @throws Exception is thrown if the route could not be started for whatever reason 514 */ 515 void startRoute(String routeId) throws Exception; 516 517 /** 518 * Stops the given route. 519 * 520 * @param route the route to stop 521 * @throws Exception is thrown if the route could not be stopped for whatever reason 522 * @deprecated use {@link org.apache.camel.model.ModelCamelContext#stopRoute(org.apache.camel.model.RouteDefinition)} 523 */ 524 @Deprecated 525 void stopRoute(RouteDefinition route) throws Exception; 526 527 /** 528 * Stops the given route using {@link org.apache.camel.spi.ShutdownStrategy}. 529 * 530 * @param routeId the route id 531 * @throws Exception is thrown if the route could not be stopped for whatever reason 532 * @see #suspendRoute(String) 533 */ 534 void stopRoute(String routeId) throws Exception; 535 536 /** 537 * Stops the given route using {@link org.apache.camel.spi.ShutdownStrategy} with a specified timeout. 538 * 539 * @param routeId the route id 540 * @param timeout timeout 541 * @param timeUnit the unit to use 542 * @throws Exception is thrown if the route could not be stopped for whatever reason 543 * @see #suspendRoute(String, long, java.util.concurrent.TimeUnit) 544 */ 545 void stopRoute(String routeId, long timeout, TimeUnit timeUnit) throws Exception; 546 547 /** 548 * Stops the given route using {@link org.apache.camel.spi.ShutdownStrategy} with a specified timeout 549 * and optional abortAfterTimeout mode. 550 * 551 * @param routeId the route id 552 * @param timeout timeout 553 * @param timeUnit the unit to use 554 * @param abortAfterTimeout should abort shutdown after timeout 555 * @return <tt>true</tt> if the route is stopped before the timeout 556 * @throws Exception is thrown if the route could not be stopped for whatever reason 557 * @see #suspendRoute(String, long, java.util.concurrent.TimeUnit) 558 */ 559 boolean stopRoute(String routeId, long timeout, TimeUnit timeUnit, boolean abortAfterTimeout) throws Exception; 560 561 /** 562 * Shutdown and <b>removes</b> the given route using {@link org.apache.camel.spi.ShutdownStrategy}. 563 * 564 * @param routeId the route id 565 * @throws Exception is thrown if the route could not be shutdown for whatever reason 566 * @deprecated use {@link #stopRoute(String)} and {@link #removeRoute(String)} 567 */ 568 @Deprecated 569 void shutdownRoute(String routeId) throws Exception; 570 571 /** 572 * Shutdown and <b>removes</b> the given route using {@link org.apache.camel.spi.ShutdownStrategy} with a specified timeout. 573 * 574 * @param routeId the route id 575 * @param timeout timeout 576 * @param timeUnit the unit to use 577 * @throws Exception is thrown if the route could not be shutdown for whatever reason 578 * @deprecated use {@link #stopRoute(String, long, java.util.concurrent.TimeUnit)} and {@link #removeRoute(String)} 579 */ 580 @Deprecated 581 void shutdownRoute(String routeId, long timeout, TimeUnit timeUnit) throws Exception; 582 583 /** 584 * Removes the given route (the route <b>must</b> be stopped before it can be removed). 585 * <p/> 586 * <br/>A route which is removed will be unregistered from JMX, have its services stopped/shutdown and the route 587 * definition etc. will also be removed. All the resources related to the route will be stopped and cleared. 588 * <p/> 589 * <br/>End users can use this method to remove unwanted routes or temporary routes which no longer is in demand. 590 * 591 * @param routeId the route id 592 * @return <tt>true</tt> if the route was removed, <tt>false</tt> if the route could not be removed because its not stopped 593 * @throws Exception is thrown if the route could not be shutdown for whatever reason 594 */ 595 boolean removeRoute(String routeId) throws Exception; 596 597 /** 598 * Resumes the given route if it has been previously suspended 599 * <p/> 600 * If the route does <b>not</b> support suspension the route will be started instead 601 * 602 * @param routeId the route id 603 * @throws Exception is thrown if the route could not be resumed for whatever reason 604 */ 605 void resumeRoute(String routeId) throws Exception; 606 607 /** 608 * Suspends the given route using {@link org.apache.camel.spi.ShutdownStrategy}. 609 * <p/> 610 * Suspending a route is more gently than stopping, as the route consumers will be suspended (if they support) 611 * otherwise the consumers will be stopped. 612 * <p/> 613 * By suspending the route services will be kept running (if possible) and therefore its faster to resume the route. 614 * <p/> 615 * If the route does <b>not</b> support suspension the route will be stopped instead 616 * 617 * @param routeId the route id 618 * @throws Exception is thrown if the route could not be suspended for whatever reason 619 */ 620 void suspendRoute(String routeId) throws Exception; 621 622 /** 623 * Suspends the given route using {@link org.apache.camel.spi.ShutdownStrategy} with a specified timeout. 624 * <p/> 625 * Suspending a route is more gently than stopping, as the route consumers will be suspended (if they support) 626 * otherwise the consumers will be stopped. 627 * <p/> 628 * By suspending the route services will be kept running (if possible) and therefore its faster to resume the route. 629 * <p/> 630 * If the route does <b>not</b> support suspension the route will be stopped instead 631 * 632 * @param routeId the route id 633 * @param timeout timeout 634 * @param timeUnit the unit to use 635 * @throws Exception is thrown if the route could not be suspended for whatever reason 636 */ 637 void suspendRoute(String routeId, long timeout, TimeUnit timeUnit) throws Exception; 638 639 /** 640 * Returns the current status of the given route 641 * 642 * @param routeId the route id 643 * @return the status for the route 644 */ 645 ServiceStatus getRouteStatus(String routeId); 646 647 /** 648 * Indicates whether current thread is starting route(s). 649 * <p/> 650 * This can be useful to know by {@link LifecycleStrategy} or the likes, in case 651 * they need to react differently. 652 * 653 * @return <tt>true</tt> if current thread is starting route(s), or <tt>false</tt> if not. 654 */ 655 boolean isStartingRoutes(); 656 657 /** 658 * Indicates whether current thread is setting up route(s) as part of starting Camel from spring/blueprint. 659 * <p/> 660 * This can be useful to know by {@link LifecycleStrategy} or the likes, in case 661 * they need to react differently. 662 * <p/> 663 * As the startup procedure of {@link CamelContext} is slightly different when using plain Java versus 664 * Spring or Blueprint, then we need to know when Spring/Blueprint is setting up the routes, which 665 * can happen after the {@link CamelContext} itself is in started state, due the asynchronous event nature 666 * of especially Blueprint. 667 * 668 * @return <tt>true</tt> if current thread is setting up route(s), or <tt>false</tt> if not. 669 */ 670 boolean isSetupRoutes(); 671 672 // Properties 673 //----------------------------------------------------------------------- 674 675 /** 676 * Returns the type converter used to coerce types from one type to another 677 * 678 * @return the converter 679 */ 680 TypeConverter getTypeConverter(); 681 682 /** 683 * Returns the type converter registry where type converters can be added or looked up 684 * 685 * @return the type converter registry 686 */ 687 TypeConverterRegistry getTypeConverterRegistry(); 688 689 /** 690 * Returns the registry used to lookup components by name and type such as the Spring ApplicationContext, 691 * JNDI or the OSGi Service Registry 692 * 693 * @return the registry 694 */ 695 Registry getRegistry(); 696 697 /** 698 * Returns the registry used to lookup components by name and as the given type 699 * 700 * @param type the registry type such as {@link org.apache.camel.impl.JndiRegistry} 701 * @return the registry, or <tt>null</tt> if the given type was not found as a registry implementation 702 */ 703 <T> T getRegistry(Class<T> type); 704 705 /** 706 * Returns the injector used to instantiate objects by type 707 * 708 * @return the injector 709 */ 710 Injector getInjector(); 711 712 /** 713 * Returns the management mbean assembler 714 * 715 * @return the mbean assembler 716 */ 717 ManagementMBeanAssembler getManagementMBeanAssembler(); 718 719 /** 720 * Returns the lifecycle strategies used to handle lifecycle notifications 721 * 722 * @return the lifecycle strategies 723 */ 724 List<LifecycleStrategy> getLifecycleStrategies(); 725 726 /** 727 * Adds the given lifecycle strategy to be used. 728 * 729 * @param lifecycleStrategy the strategy 730 */ 731 void addLifecycleStrategy(LifecycleStrategy lifecycleStrategy); 732 733 /** 734 * Resolves a language for creating expressions 735 * 736 * @param language name of the language 737 * @return the resolved language 738 */ 739 Language resolveLanguage(String language); 740 741 /** 742 * Parses the given text and resolve any property placeholders - using {{key}}. 743 * 744 * @param text the text such as an endpoint uri or the likes 745 * @return the text with resolved property placeholders 746 * @throws Exception is thrown if property placeholders was used and there was an error resolving them 747 */ 748 String resolvePropertyPlaceholders(String text) throws Exception; 749 750 /** 751 * Returns the configured property placeholder prefix token if and only if the context has 752 * property placeholder abilities, otherwise returns {@code null}. 753 * 754 * @return the prefix token or {@code null} 755 */ 756 String getPropertyPrefixToken(); 757 758 /** 759 * Returns the configured property placeholder suffix token if and only if the context has 760 * property placeholder abilities, otherwise returns {@code null}. 761 * 762 * @return the suffix token or {@code null} 763 */ 764 String getPropertySuffixToken(); 765 766 /** 767 * Gets a readonly list with the names of the languages currently registered. 768 * 769 * @return a readonly list with the names of the the languages 770 */ 771 List<String> getLanguageNames(); 772 773 /** 774 * Creates a new {@link ProducerTemplate} which is <b>started</b> and therefore ready to use right away. 775 * <p/> 776 * See this FAQ before use: <a href="http://camel.apache.org/why-does-camel-use-too-many-threads-with-producertemplate.html"> 777 * Why does Camel use too many threads with ProducerTemplate?</a> 778 * <p/> 779 * <b>Important:</b> Make sure to call {@link org.apache.camel.ProducerTemplate#stop()} when you are done using the template, 780 * to clean up any resources. 781 * <p/> 782 * Will use cache size defined in Camel property with key {@link Exchange#MAXIMUM_CACHE_POOL_SIZE}. 783 * If no key was defined then it will fallback to a default size of 1000. 784 * You can also use the {@link org.apache.camel.ProducerTemplate#setMaximumCacheSize(int)} method to use a custom value 785 * before starting the template. 786 * 787 * @return the template 788 * @throws RuntimeCamelException is thrown if error starting the template 789 */ 790 ProducerTemplate createProducerTemplate(); 791 792 /** 793 * Creates a new {@link ProducerTemplate} which is <b>started</b> and therefore ready to use right away. 794 * <p/> 795 * See this FAQ before use: <a href="http://camel.apache.org/why-does-camel-use-too-many-threads-with-producertemplate.html"> 796 * Why does Camel use too many threads with ProducerTemplate?</a> 797 * <p/> 798 * <b>Important:</b> Make sure to call {@link ProducerTemplate#stop()} when you are done using the template, 799 * to clean up any resources. 800 * 801 * @param maximumCacheSize the maximum cache size 802 * @return the template 803 * @throws RuntimeCamelException is thrown if error starting the template 804 */ 805 ProducerTemplate createProducerTemplate(int maximumCacheSize); 806 807 /** 808 * Creates a new {@link ConsumerTemplate} which is <b>started</b> and therefore ready to use right away. 809 * <p/> 810 * See this FAQ before use: <a href="http://camel.apache.org/why-does-camel-use-too-many-threads-with-producertemplate.html"> 811 * Why does Camel use too many threads with ProducerTemplate?</a> as it also applies for ConsumerTemplate. 812 * <p/> 813 * <b>Important:</b> Make sure to call {@link ConsumerTemplate#stop()} when you are done using the template, 814 * to clean up any resources. 815 * <p/> 816 * Will use cache size defined in Camel property with key {@link Exchange#MAXIMUM_CACHE_POOL_SIZE}. 817 * If no key was defined then it will fallback to a default size of 1000. 818 * You can also use the {@link org.apache.camel.ConsumerTemplate#setMaximumCacheSize(int)} method to use a custom value 819 * before starting the template. 820 * 821 * @return the template 822 * @throws RuntimeCamelException is thrown if error starting the template 823 */ 824 ConsumerTemplate createConsumerTemplate(); 825 826 /** 827 * Creates a new {@link ConsumerTemplate} which is <b>started</b> and therefore ready to use right away. 828 * <p/> 829 * See this FAQ before use: <a href="http://camel.apache.org/why-does-camel-use-too-many-threads-with-producertemplate.html"> 830 * Why does Camel use too many threads with ProducerTemplate?</a> as it also applies for ConsumerTemplate. 831 * <p/> 832 * <b>Important:</b> Make sure to call {@link ConsumerTemplate#stop()} when you are done using the template, 833 * to clean up any resources. 834 * 835 * @param maximumCacheSize the maximum cache size 836 * @return the template 837 * @throws RuntimeCamelException is thrown if error starting the template 838 */ 839 ConsumerTemplate createConsumerTemplate(int maximumCacheSize); 840 841 /** 842 * Adds the given interceptor strategy 843 * 844 * @param interceptStrategy the strategy 845 */ 846 void addInterceptStrategy(InterceptStrategy interceptStrategy); 847 848 /** 849 * Gets the interceptor strategies 850 * 851 * @return the list of current interceptor strategies 852 */ 853 List<InterceptStrategy> getInterceptStrategies(); 854 855 /** 856 * Gets the default error handler builder which is inherited by the routes 857 * @deprecated The return type will be switched to {@link ErrorHandlerFactory} in Camel 3.0 858 * 859 * @return the builder 860 */ 861 @Deprecated 862 ErrorHandlerBuilder getErrorHandlerBuilder(); 863 864 /** 865 * Sets the default error handler builder which is inherited by the routes 866 * 867 * @param errorHandlerBuilder the builder 868 */ 869 void setErrorHandlerBuilder(ErrorHandlerFactory errorHandlerBuilder); 870 871 /** 872 * Gets the default shared thread pool for error handlers which 873 * leverages this for asynchronous redelivery tasks. 874 */ 875 ScheduledExecutorService getErrorHandlerExecutorService(); 876 877 /** 878 * Sets the data formats that can be referenced in the routes. 879 * 880 * @param dataFormats the data formats 881 * @deprecated use {@link org.apache.camel.model.ModelCamelContext#setDataFormats(java.util.Map)} 882 */ 883 @Deprecated 884 void setDataFormats(Map<String, DataFormatDefinition> dataFormats); 885 886 /** 887 * Gets the data formats that can be referenced in the routes. 888 * 889 * @return the data formats available 890 * @deprecated use {@link org.apache.camel.model.ModelCamelContext#getDataFormats()} 891 */ 892 @Deprecated 893 Map<String, DataFormatDefinition> getDataFormats(); 894 895 /** 896 * Resolve a data format given its name 897 * 898 * @param name the data format name or a reference to it in the {@link Registry} 899 * @return the resolved data format, or <tt>null</tt> if not found 900 */ 901 DataFormat resolveDataFormat(String name); 902 903 /** 904 * Resolve a data format definition given its name 905 * 906 * @param name the data format definition name or a reference to it in the {@link Registry} 907 * @return the resolved data format definition, or <tt>null</tt> if not found 908 * @deprecated use {@link org.apache.camel.model.ModelCamelContext#resolveDataFormatDefinition(String)} 909 */ 910 @Deprecated 911 DataFormatDefinition resolveDataFormatDefinition(String name); 912 913 /** 914 * Gets the current data format resolver 915 * 916 * @return the resolver 917 */ 918 DataFormatResolver getDataFormatResolver(); 919 920 /** 921 * Sets a custom data format resolver 922 * 923 * @param dataFormatResolver the resolver 924 */ 925 void setDataFormatResolver(DataFormatResolver dataFormatResolver); 926 927 /** 928 * Sets the properties that can be referenced in the camel context 929 * 930 * @param properties properties 931 */ 932 void setProperties(Map<String, String> properties); 933 934 /** 935 * Gets the properties that can be referenced in the camel context 936 * 937 * @return the properties 938 */ 939 Map<String, String> getProperties(); 940 941 /** 942 * Gets the property value that can be referenced in the camel context 943 * 944 * @return the string value of property 945 */ 946 String getProperty(String name); 947 948 /** 949 * Gets the default FactoryFinder which will be used for the loading the factory class from META-INF 950 * 951 * @return the default factory finder 952 */ 953 FactoryFinder getDefaultFactoryFinder(); 954 955 /** 956 * Sets the factory finder resolver to use. 957 * 958 * @param resolver the factory finder resolver 959 */ 960 void setFactoryFinderResolver(FactoryFinderResolver resolver); 961 962 /** 963 * Gets the FactoryFinder which will be used for the loading the factory class from META-INF in the given path 964 * 965 * @param path the META-INF path 966 * @return the factory finder 967 * @throws NoFactoryAvailableException is thrown if a factory could not be found 968 */ 969 FactoryFinder getFactoryFinder(String path) throws NoFactoryAvailableException; 970 971 /** 972 * Returns the class resolver to be used for loading/lookup of classes. 973 * 974 * @return the resolver 975 */ 976 ClassResolver getClassResolver(); 977 978 /** 979 * Returns the package scanning class resolver 980 * 981 * @return the resolver 982 */ 983 PackageScanClassResolver getPackageScanClassResolver(); 984 985 /** 986 * Sets the class resolver to be use 987 * 988 * @param resolver the resolver 989 */ 990 void setClassResolver(ClassResolver resolver); 991 992 /** 993 * Sets the package scanning class resolver to use 994 * 995 * @param resolver the resolver 996 */ 997 void setPackageScanClassResolver(PackageScanClassResolver resolver); 998 999 /** 1000 * Sets a pluggable service pool to use for {@link Producer} pooling. 1001 * 1002 * @param servicePool the pool 1003 */ 1004 void setProducerServicePool(ServicePool<Endpoint, Producer> servicePool); 1005 1006 /** 1007 * Gets the service pool for {@link Producer} pooling. 1008 * 1009 * @return the service pool 1010 */ 1011 ServicePool<Endpoint, Producer> getProducerServicePool(); 1012 1013 /** 1014 * Uses a custom node id factory when generating auto assigned ids to the nodes in the route definitions 1015 * 1016 * @param factory custom factory to use 1017 */ 1018 void setNodeIdFactory(NodeIdFactory factory); 1019 1020 /** 1021 * Gets the node id factory 1022 * 1023 * @return the node id factory 1024 */ 1025 NodeIdFactory getNodeIdFactory(); 1026 1027 /** 1028 * Gets the management strategy 1029 * 1030 * @return the management strategy 1031 */ 1032 ManagementStrategy getManagementStrategy(); 1033 1034 /** 1035 * Sets the management strategy to use 1036 * 1037 * @param strategy the management strategy 1038 */ 1039 void setManagementStrategy(ManagementStrategy strategy); 1040 1041 /** 1042 * Gets the default tracer 1043 * 1044 * @return the default tracer 1045 */ 1046 InterceptStrategy getDefaultTracer(); 1047 1048 /** 1049 * Sets a custom tracer to be used as the default tracer. 1050 * <p/> 1051 * <b>Note:</b> This must be set before any routes are created, 1052 * changing the default tracer for existing routes is not supported. 1053 * 1054 * @param tracer the custom tracer to use as default tracer 1055 */ 1056 void setDefaultTracer(InterceptStrategy tracer); 1057 1058 /** 1059 * Gets the default backlog tracer 1060 * 1061 * @return the default backlog tracer 1062 */ 1063 InterceptStrategy getDefaultBacklogTracer(); 1064 1065 /** 1066 * Sets a custom backlog tracer to be used as the default backlog tracer. 1067 * <p/> 1068 * <b>Note:</b> This must be set before any routes are created, 1069 * changing the default backlog tracer for existing routes is not supported. 1070 * 1071 * @param backlogTracer the custom tracer to use as default backlog tracer 1072 */ 1073 void setDefaultBacklogTracer(InterceptStrategy backlogTracer); 1074 1075 /** 1076 * Gets the default backlog debugger 1077 * 1078 * @return the default backlog debugger 1079 */ 1080 InterceptStrategy getDefaultBacklogDebugger(); 1081 1082 /** 1083 * Sets a custom backlog debugger to be used as the default backlog debugger. 1084 * <p/> 1085 * <b>Note:</b> This must be set before any routes are created, 1086 * changing the default backlog debugger for existing routes is not supported. 1087 * 1088 * @param backlogDebugger the custom debugger to use as default backlog debugger 1089 */ 1090 void setDefaultBacklogDebugger(InterceptStrategy backlogDebugger); 1091 1092 /** 1093 * Disables using JMX as {@link org.apache.camel.spi.ManagementStrategy}. 1094 * <p/> 1095 * <b>Important:</b> This method must be called <b>before</b> the {@link CamelContext} is started. 1096 * 1097 * @throws IllegalStateException is thrown if the {@link CamelContext} is not in stopped state. 1098 */ 1099 void disableJMX() throws IllegalStateException; 1100 1101 /** 1102 * Gets the inflight repository 1103 * 1104 * @return the repository 1105 */ 1106 InflightRepository getInflightRepository(); 1107 1108 /** 1109 * Sets a custom inflight repository to use 1110 * 1111 * @param repository the repository 1112 */ 1113 void setInflightRepository(InflightRepository repository); 1114 1115 /** 1116 * Gets the the application context class loader which may be helpful for running camel in other containers 1117 * 1118 * @return the application context class loader 1119 */ 1120 ClassLoader getApplicationContextClassLoader(); 1121 1122 /** 1123 * Sets the application context class loader 1124 * 1125 * @param classLoader the class loader 1126 */ 1127 void setApplicationContextClassLoader(ClassLoader classLoader); 1128 1129 /** 1130 * Gets the current shutdown strategy 1131 * 1132 * @return the strategy 1133 */ 1134 ShutdownStrategy getShutdownStrategy(); 1135 1136 /** 1137 * Sets a custom shutdown strategy 1138 * 1139 * @param shutdownStrategy the custom strategy 1140 */ 1141 void setShutdownStrategy(ShutdownStrategy shutdownStrategy); 1142 1143 /** 1144 * Gets the current {@link org.apache.camel.spi.ExecutorServiceManager} 1145 * 1146 * @return the manager 1147 */ 1148 ExecutorServiceManager getExecutorServiceManager(); 1149 1150 /** 1151 * Gets the current {@link org.apache.camel.spi.ExecutorServiceStrategy} 1152 * 1153 * @return the manager 1154 * @deprecated use {@link #getExecutorServiceManager()} 1155 */ 1156 @Deprecated 1157 org.apache.camel.spi.ExecutorServiceStrategy getExecutorServiceStrategy(); 1158 1159 /** 1160 * Sets a custom {@link org.apache.camel.spi.ExecutorServiceManager} 1161 * 1162 * @param executorServiceManager the custom manager 1163 */ 1164 void setExecutorServiceManager(ExecutorServiceManager executorServiceManager); 1165 1166 /** 1167 * Gets the current {@link org.apache.camel.spi.ProcessorFactory} 1168 * 1169 * @return the factory, can be <tt>null</tt> if no custom factory has been set 1170 */ 1171 ProcessorFactory getProcessorFactory(); 1172 1173 /** 1174 * Sets a custom {@link org.apache.camel.spi.ProcessorFactory} 1175 * 1176 * @param processorFactory the custom factory 1177 */ 1178 void setProcessorFactory(ProcessorFactory processorFactory); 1179 1180 /** 1181 * Gets the current {@link Debugger} 1182 * 1183 * @return the debugger 1184 */ 1185 Debugger getDebugger(); 1186 1187 /** 1188 * Sets a custom {@link Debugger} 1189 * 1190 * @param debugger the debugger 1191 */ 1192 void setDebugger(Debugger debugger); 1193 1194 /** 1195 * Gets the current {@link UuidGenerator} 1196 * 1197 * @return the uuidGenerator 1198 */ 1199 UuidGenerator getUuidGenerator(); 1200 1201 /** 1202 * Sets a custom {@link UuidGenerator} (should only be set once) 1203 * 1204 * @param uuidGenerator the UUID Generator 1205 */ 1206 void setUuidGenerator(UuidGenerator uuidGenerator); 1207 1208 /** 1209 * Whether or not type converters should be loaded lazy 1210 * 1211 * @return <tt>true</tt> to load lazy, <tt>false</tt> to load on startup 1212 * @deprecated this option is no longer supported, will be removed in a future Camel release. 1213 */ 1214 @Deprecated 1215 Boolean isLazyLoadTypeConverters(); 1216 1217 /** 1218 * Sets whether type converters should be loaded lazy 1219 * 1220 * @param lazyLoadTypeConverters <tt>true</tt> to load lazy, <tt>false</tt> to load on startup 1221 * @deprecated this option is no longer supported, will be removed in a future Camel release. 1222 */ 1223 @Deprecated 1224 void setLazyLoadTypeConverters(Boolean lazyLoadTypeConverters); 1225 1226 /** 1227 * Whether or not type converter statistics is enabled. 1228 * <p/> 1229 * By default the type converter utilization statistics is disabled. 1230 * <b>Notice:</b> If enabled then there is a slight performance impact under very heavy load. 1231 * 1232 * @return <tt>true</tt> if enabled, <tt>false</tt> if disabled (default). 1233 */ 1234 Boolean isTypeConverterStatisticsEnabled(); 1235 1236 /** 1237 * Sets whether or not type converter statistics is enabled. 1238 * <p/> 1239 * By default the type converter utilization statistics is disabled. 1240 * <b>Notice:</b> If enabled then there is a slight performance impact under very heavy load. 1241 * <p/> 1242 * You can enable/disable the statistics at runtime using the 1243 * {@link org.apache.camel.spi.TypeConverterRegistry#getStatistics()#setTypeConverterStatisticsEnabled(Boolean)} method, 1244 * or from JMX on the {@link org.apache.camel.api.management.mbean.ManagedTypeConverterRegistryMBean} mbean. 1245 * 1246 * @param typeConverterStatisticsEnabled <tt>true</tt> to enable, <tt>false</tt> to disable 1247 */ 1248 void setTypeConverterStatisticsEnabled(Boolean typeConverterStatisticsEnabled); 1249 1250 /** 1251 * Whether or not <a href="http://www.slf4j.org/api/org/slf4j/MDC.html">MDC</a> logging is being enabled. 1252 * 1253 * @return <tt>true</tt> if MDC logging is enabled 1254 */ 1255 Boolean isUseMDCLogging(); 1256 1257 /** 1258 * Set whether <a href="http://www.slf4j.org/api/org/slf4j/MDC.html">MDC</a> is enabled. 1259 * 1260 * @param useMDCLogging <tt>true</tt> to enable MDC logging, <tt>false</tt> to disable 1261 */ 1262 void setUseMDCLogging(Boolean useMDCLogging); 1263 1264 /** 1265 * Whether or not breadcrumb is enabled. 1266 * 1267 * @return <tt>true</tt> if breadcrumb is enabled 1268 */ 1269 Boolean isUseBreadcrumb(); 1270 1271 /** 1272 * Set whether breadcrumb is enabled. 1273 * 1274 * @param useBreadcrumb <tt>true</tt> to enable breadcrumb, <tt>false</tt> to disable 1275 */ 1276 void setUseBreadcrumb(Boolean useBreadcrumb); 1277 1278 /** 1279 * Find information about all the Camel components available in the classpath and {@link org.apache.camel.spi.Registry}. 1280 * 1281 * @return a map with the component name, and value with component details. 1282 * @throws LoadPropertiesException is thrown if error during classpath discovery of the components 1283 * @throws IOException is thrown if error during classpath discovery of the components 1284 */ 1285 Map<String, Properties> findComponents() throws LoadPropertiesException, IOException; 1286 1287 /** 1288 * Returns the HTML documentation for the given camel component 1289 */ 1290 String getComponentDocumentation(String componentName) throws IOException; 1291 1292 /** 1293 * Creates a JSON representation of all the <b>static</b> and <b>dynamic</b> configured endpoints defined in the given route(s). 1294 * 1295 * @param routeId for a particular route, or <tt>null</tt> for all routes 1296 * @return a JSON string 1297 */ 1298 String createRouteStaticEndpointJson(String routeId); 1299 1300 /** 1301 * Creates a JSON representation of all the <b>static</b> (and possible <b>dynamic</b>) configured endpoints defined in the given route(s). 1302 * 1303 * @param routeId for a particular route, or <tt>null</tt> for all routes 1304 * @param includeDynamic whether to include dynamic endpoints 1305 * @return a JSON string 1306 */ 1307 String createRouteStaticEndpointJson(String routeId, boolean includeDynamic); 1308 1309 /** 1310 * Gets the {@link StreamCachingStrategy} to use. 1311 */ 1312 StreamCachingStrategy getStreamCachingStrategy(); 1313 1314 /** 1315 * Sets a custom {@link StreamCachingStrategy} to use. 1316 */ 1317 void setStreamCachingStrategy(StreamCachingStrategy streamCachingStrategy); 1318 1319 /** 1320 * Gets the {@link UnitOfWorkFactory} to use. 1321 */ 1322 UnitOfWorkFactory getUnitOfWorkFactory(); 1323 1324 /** 1325 * Sets a custom {@link UnitOfWorkFactory} to use. 1326 */ 1327 void setUnitOfWorkFactory(UnitOfWorkFactory unitOfWorkFactory); 1328 1329 /** 1330 * Gets the {@link org.apache.camel.spi.RuntimeEndpointRegistry} to use, or <tt>null</tt> if none is in use. 1331 */ 1332 RuntimeEndpointRegistry getRuntimeEndpointRegistry(); 1333 1334 /** 1335 * Sets a custom {@link org.apache.camel.spi.RuntimeEndpointRegistry} to use. 1336 */ 1337 void setRuntimeEndpointRegistry(RuntimeEndpointRegistry runtimeEndpointRegistry); 1338 1339 }