2011-05-12 8 views
7

Tengo mi propia respuesta a esta pregunta, la cual publicaré, pero quería ver si me perdía una manera más simple. Tengo dos aplicaciones ejecutándose en el mismo servidor de ColdFusion, y quiero acceder al alcance de la aplicación de una de la otra. ¿Cómo podría hacer esto?¿Cómo acceder a un alcance de aplicación desde una aplicación separada en ColdFusion 9?

ACTUALIZACIÓN:

después de leer @ Daniel y @ respuestas de Ben, que volvió y se acercó a mi problema desde el punto de vista de sub-aplicaciones que resultó ser una mejor solución a mi problema inicial. Mi respuesta sigue siendo la forma "rápida y sucia" de acceder a otros ámbitos de aplicación, pero poner datos en el ámbito del servidor es una práctica mejor.

Respuesta

7

Creo que probablemente deberías pensar por qué es que quieres hacer esto ... Arquitectónicamente, esto no parece muy bueno, incluso si es posible. El alcance del Servidor sería mejor para los recursos que desea compartir en todas las aplicaciones.

Quizás desee considerar si las dos aplicaciones deberían ser realmente una sola aplicación con dos subaplicaciones pequeñas.

+0

Cuando tengo una aplicación de sub, entonces tiene su propio ámbito de aplicación, y tengo que aplicar la misma solución para acceder a ella. Esta es mi experiencia de todos modos cuando tengo una carpeta principal con una application.cfc y una subcarpeta con su propia application.cfc. ¿Quizás podría publicar un ejemplo en el que la aplicación secundaria comparta el alcance de la aplicación principal? –

+0

También debo decir que la razón por la que quiero hacer esto es porque tengo una aplicación que consume servicios de otra aplicación. Necesito invocar CFC desde App1 en App2, pero hacer que se ejecuten en el ámbito de App1 en lugar del ámbito de App2, como lo hacen cuando utiliza cfinvoke o crea una instancia directamente. –

+0

Esto realmente suena como un candidato para que todo sea una sola aplicación. Una forma de lograr el alcance de la aplicación compartida sería utilizar una aplicación.cfc extendida en los subdirectorios que contienen cada aplicación. Las aplicaciones pueden tener cualquier aplicación personalizada que necesiten, pero deben mantener un ámbito de aplicación común. –

3

Junté mi respuesta de dos fuentes. Primero, el Massive Exploration de Ben Nadel del objeto ColdFusion PageContext (Gracias Ben). En segundo lugar, la página de ayuda de ColdFusion en Interoperating with JSP pages and servlets. Ponga los dos juntos y me sale esto:

estructura

Directorio:

Root 
|_ App1 
    |_ Application.cfc 
    |_ index.cfm 
|_ App2 
    |_ Application.cfc 
    |_ index.cfm 

App1/Application.cfc:

component 
{ 
this.name="App1"; 
this.application.foo = "bar" 
} 

App2/Application.cfc:

component 
{ 
this.name="App2" 
} 

App2 /index.cfm

<cfscript> 
writeDump(getPageContext().getFusionContext().getServletContext().getAttribute('App1')) 
</cfscript> 

Después de presionar index.cfm en el directorio de la aplicación 1, puede ver el alcance de la aplicación desde la aplicación 1 descargada en el índice de la aplicación2.

2

Estoy completamente de acuerdo con @Daniel sobre la arquitectura.
@ La respuesta de Ryan es buena.

Pensé que ofrecería la alternativa que yo pensaba, que tiene algunas ventajas y algunas desventajas.

Básicamente, cualquier información que se comparta entre las aplicaciones se puede escribir en el ámbito del servidor. Por ejemplo:

// In App 1 
application.foo = "bar"; 
server.sharedData.app1.fpp = "bar"; 

// In App 2 
application.bar = "foo"; 
server.sharedData.app2.bar = "foo"; 
// Use shared data from App 1 
writeOutput(server.sharedData.app1.foo); 

Ventajas:

  • más simple sintaxis
  • compartieron datos disponibles para todas las aplicaciones

Desventajas

  • Tienes que recordaba a actualizar el servidor .sharedData s hacer frente cada vez que actualice la aplicación scoe.
  • tenga cuidado al elegir su clave de estructura maestra. No desea sobrecargar los datos del alcance del servidor existente.
  • Los datos compartidos están disponibles para todas las aplicaciones. :-)

De todos modos, esto fue lo primero que pensé, pero después de leer la respuesta de @ Ryan, me probaly acaba de escribir una UDF que lleva un nombre de aplicación y un nombre var, y usarlo como una fachada para lo que él hizo.

Pero en serio, considere si el intercambio de datos entre las aplicaciones es más inteligente/más inteligente que si se fusionan.

+0

Esta es una buena solución, gracias por el ejemplo. En mi situación particular, soy cauteloso sobre la configuración de variables de ámbito de servidor porque tengo poco control sobre el servidor, pero esta es una buena solución para alguien que tiene ese control. Me gusta la idea de ponerlo detrás de una fachada, tendré que implementar eso en mi aplicación. –

1

Los ámbitos de la aplicación ColdFusion son manejados por la clase Java ApplicationScopeTracker.

Puede acceder al ámbito de aplicación de otra aplicación.

¡No está documentado y no lo usaría para nada en producción!

Digamos que tiene 2 aplicaciones web con los nombres app1 y app2.

ejecutar esto en app1 para acceder a app2 's alcance de uso:

<cfscript> 
appTracker = createObject('java', 'coldfusion.runtime.ApplicationScopeTracker'); 
app2 = appTracker.getApplicationScope('app2'); 
</cfscript> 

Si la aplicación app2 no se ha iniciado, o se ha agotado el tiempo, getApplicationScope() volverá indefinido.

También puede obtener una enumeración de todos los ámbitos de aplicación actuales utilizando appTracker.getApplicationKeys()

Cuestiones relacionadas