2010-03-25 79 views
1

我們使用EHCache和CF 8通過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.

誰能給我一個如何把一個對象了一個例子http使用CF?如果CF無法實現這一點,那麼一個Java例子將成爲下一個最好的例子。

非常感謝提前!

PS:我不想使用序列化到文本/ JSON等,因爲這種方法有數據完整性的問題,最重要的是它不夠快。

+0

你可以切換到CF9嗎?它有內置的ehcache掛鉤。 – kevink

+2

在cfhttpparam/value中傳遞的值必須是一個字符串 - 無論是文本還是二進制。你將不得不以某種方式序列化arguments.item。 –

+0

@kevink - CF9只允許緩存到本地系統,而不是中央緩存服務器AFAIK。我們正在使用集羣環境。 –

回答

2

我想通了,我可以使用上面,如果我做了以下的ARGUMENTS.item變量之前,我把它傳遞給函數的確切代碼:

<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) /> 

賓果!之後,serializedQuery就可以使用,並且可以通過HTTP在線路上傳輸。當您從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

是的,您將不得不序列化參數結構,因爲沒有任何形式的序列化就無法通過HTTP傳遞二進制對象。如前所述,您可以使用JSON序列化對象。 JSON的另一種替代方法是可以將對象轉換爲XML的cfwddx標籤。但是JSON可能更好,因爲它不像cfwddx生成的XML那麼冗長。