2010-03-25 4 views
1

우리는 CF 8과 함께 EHCache를 사용하여 HTTP를 통해 RESTful 인터페이스를 사용하여 중앙 서버에 항목을 캐시합니다. 캐시 서버에 개체의 cfquery 개체를 캐시하려고합니다.Coldfusion 8 및 HTTP PUT - 개체를 PUT 할 수있는 방법이 있습니까?

EHCache를 직접 호출 (즉, 로컬 캐시에 저장)하면 작동하지만 HTTP를 통해 원격 서버에서 캐시하려고하면 문제가 발생합니다.

다음과 같이 내가 사용하고있는 코드는 다음과 같습니다

<cfhttp url="http://localhost:8080/myCache/myKey" 
    method="put" 
    result="r" 
    timeout="2" 
    throwonerror="true" > 
    <cfhttpparam type="body" value="#ARGUMENTS.item#" /> 
</cfhttp> 

CF가 #ARGUMENTS.item#이 참조를 싫어하고 불평 Complex object types cannot be converted to simple values.

누구도 날에 물건을 넣어하는 방법의 예를 줄 수 CF를 사용하여 http? CF를 사용하여 이것이 가능하지 않다면 Java 예제가 차선책 일 것입니다.

미리 감사드립니다.

추 신 :이 접근 방식은 데이터 무결성에 문제가 있으며 가장 중요한 것은 충분히 빠르지 않으므로 text/JSON 등에 직렬화를 사용하고 싶지 않습니다.

+0

CF9로 전환 할 수 있습니까? 내장 된 ehcache 훅이 있습니다. – kevink

+2

cfhttpparam/value에 전달 된 값은 텍스트 또는 바이너리 인 문자열이어야합니다. 당신은 arguments.item을 어떤 식 으로든 serialize해야 할 것입니다. –

+0

@kevink - CF9는 중앙 캐시 서버 AFAIK가 아닌 로컬 시스템으로의 캐싱 만 허용합니다. 우리는 클러스터 된 환경을 사용하고 있습니다. –

답변

2

은 내가 내가 내가 함수에 전달하기 전에 ARGUMENTS.item 변수에 다음을 수행하는 경우 위의 정확한 코드를 사용할 수 있습니다 알아 냈어! 그 후 serializedQuery이 사용되며 HTTP를 통해 전선을 통해 PUT 할 수 있습니다. 다시 EHCache는에서 그것을 얻을 때, 다음을 수행해야합니다

<!--- Get result value from cache ---> 
<cfset cacheData = myCache.get(myCacheName, key) /> 

<!--- Java objects setup ---> 
<cfset byteArrayInputStream = createObject("java","java.io.ByteArrayInputStream") /> 
<cfset objectInputStream = createObject("java","java.io.ObjectInputStream") /> 

<!--- deserialize ---> 
<cfset ba = toBinary(cacheData) /> 
<cfset byteArrayInputStream.init(ba) /> 
<cfset objectInputStream.init(byteArrayInputStream) /> 
<cfset deserializedQuery = objectInputStream.readObject() /> 
<cfset objectInputStream.close() /> 

<!--- Dump query ---> 
<cfdump var="#deserializedQuery#" /> 

직렬화의이 유형도 매우 빠르다. 나는 JSON 표현을 사용하여 다른 사람들을 이해할 수 있지만, 그들이 빠르다고 확신하지 못한다.

어쨌든, 이것은 나를 위해 좋은 것처럼 보입니다. 귀하의 의견을 모두 주셔서 감사합니다. 나는 다른 사람들이 이것을 유용하게 찾길 바랍니다.

3

예, 일부 형식의 serialization없이 HTTP를 통해 이진 객체를 전달할 방법이 없기 때문에 인수 구조를 직렬화해야합니다. 이미 언급했듯이 JSON을 사용하여 객체를 직렬화 할 수 있습니다. JSON 대신 사용할 수있는 cfwddx 태그는 객체를 XML로 변환 할 수있는 태그입니다. 하지만 JSON은 cfwddx에서 생성 된 XML만큼 자세한 정보가 아니기 때문에 아마 더 좋습니다.

<cfquery name="qData" datasource="#VARIABLES.dsn#"> 
select * from myData 
</cfquery> 

<!--- Setup and init Java objects ---> 
<cfset byteArrayOutputStream = createObject("java","java.io.ByteArrayOutputStream") /> 
<cfset objectOutputStream = createObject("java","java.io.ObjectOutputStream") /> 
<cfset byteArrayOutputStream.init() /> 
<cfset objectOutputStream.init(byteArrayOutputStream) /> 

<!--- Serialize the cfquery object ---> 
<cfset objectOutputStream.writeObject(qData) /> 
<cfset serializedQuery = toBase64(byteArrayOutputStream.toByteArray()) /> 
<cfset objectOutputStream.close() />  

<!--- Stick in the cache ---> 
<cfset myCache.put(myCacheName, key, serializedQuery) /> 

빙고 :

관련 문제