เชฒเชเชญเช เชคเชฎเชพเชฎ เชเชงเซเชจเชฟเช เชธเซเชซเซเชเชตเซเชฐ เชเชคเซเชชเชพเชฆเชจเซเชฎเชพเช เชเชฃเซ เชธเซเชตเชพเชเชจเซ เชธเชฎเชพเชตเซเชถ เชฅเชพเชฏ เชเซ. เชเชฃเซเชตเชพเชฐ, เชเชจเซเชเชฐเชธเชฐเซเชตเชฟเชธ เชเซเชจเชฒเซเชจเซ เชฒเชพเชเชฌเซ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชธเชฎเชฏ เชชเซเชฐเชฆเชฐเซเชถเชจ เชธเชฎเชธเซเชฏเชพเชเชจเซ เชธเซเชคเซเชฐเซเชค เชฌเชจเซ เชเชพเชฏ เชเซ. เช เชชเซเชฐเชเชพเชฐเชจเซ เชธเชฎเชธเซเชฏเชพเชจเซ เชชเซเชฐเชฎเชพเชฃเชญเซเชค เชเชเซเชฒ เช เชเช เชชเซเชเซเชเชฎเชพเช เชฌเชนเซเชตเชฟเชง เชเชจเซเชเชฐเชธเชฐเซเชตเชฟเชธ เชตเชฟเชจเชเชคเซเชเชจเซ เชชเซเช เชเชฐเชตเชพเชจเซ เชเซ, เชเซเชจเซ เชฌเซเชเชฟเชเช เชเชนเซเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
เชเซ เชคเชฎเซ เชฌเซเช เชชเซเชฐเซเชธเซเชธเชฟเชเชเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ, เชคเซ เชคเชฎเซ เชชเซเชฐเชฆเชฐเซเชถเชจ เช
เชฅเชตเชพ เชเซเชก เชธเซเชชเชทเซเชเชคเชพเชจเชพ เชธเชเชฆเชฐเซเชญเชฎเชพเช เชชเชฐเชฟเชฃเชพเชฎเซเชฅเซ เชเซเชถ เชจ เชนเซเช เชถเชเซ. เช เชชเชฆเซเชงเชคเชฟ เชเซเชฒเชฐ เชชเชฐ เชเชเชฒเซ เชธเชฐเชณ เชจเชฅเซ เชเซเชเชฒเซ เชคเชฎเซ เชตเชฟเชเชพเชฐเซ เชถเชเซ เชเซ. เชตเชฟเชตเชฟเชง เชนเซเชคเซเช เชฎเชพเชเซ เช
เชจเซ เชตเชฟเชตเชฟเชง เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเชเชฎเชพเช, เชเชเซเชฒเซ เชฎเซเชเชพ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช เชฌเชฆเชฒเชพเช เชถเชเซ เชเซ. เชเซเชเซเชเชธ เชเชฆเชพเชนเชฐเชฃเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ, เชนเซเช เช
เชจเซเช เช
เชญเชฟเชเชฎเซเชจเชพ เชเซเชฃเชฆเซเชท เชฌเชคเชพเชตเซเชถ.
เชชเซเชฐเชฆเชฐเซเชถเชจ เชชเซเชฐเซเชเซเชเซเช
เชธเซเชชเชทเซเชเชคเชพ เชฎเชพเชเซ, เชเชพเชฒเซ เชนเซเช เชนเชพเชฒเชฎเชพเช เชเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชชเชฐ เชเชพเชฎ เชเชฐเซเช เชเซเช เชคเซเชฎเชพเชเชจเซ เชเช เชธเซเชตเชพเชจเซเช เชเชฆเชพเชนเชฐเชฃ เชเซเชเช.
เชเชฆเชพเชนเชฐเชฃเซ เชฎเชพเชเซ เชชเซเชฒเซเชเชซเซเชฐเซเชฎ เชชเชธเชเชฆเชเซเชจเซ เชธเชฎเชเซเชคเซเชจเชฌเชณเชพ เชชเซเชฐเชฆเชฐเซเชถเชจเชจเซ เชธเชฎเชธเซเชฏเชพ เชเชเชฆเชฎ เชธเชพเชฎเชพเชจเซเชฏ เชเซ เช
เชจเซ เชคเซ เชเซเช เชเซเชเซเชเชธ เชญเชพเชทเชพเช เช
เชฅเชตเชพ เชชเซเชฒเซเชเชซเซเชฐเซเชฎเชจเซ เช
เชธเชฐ เชเชฐเชคเซ เชจเชฅเซ. เชธเชฎเชธเซเชฏเชพเช เช
เชจเซ เชเชเซเชฒเซ เชฆเชฐเซเชถเชพเชตเชตเชพ เชฎเชพเชเซ เช เชฒเซเช เชธเซเชชเซเชฐเชฟเชเช + เชเซเชเชฒเชฟเชจ เชเซเชก เชเชฆเชพเชนเชฐเชฃเซเชจเซ เชเชชเชฏเซเช เชเชฐเชถเซ. เชเซเชเชฒเชฟเชจ Java เช
เชจเซ C# เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเช เชฎเชพเชเซ เชธเชฎเชพเชจ เชฐเซเชคเซ เชธเชฎเชเซ เชถเชเชพเชฏ เชคเซเชตเซเช (เช
เชฅเชตเชพ เช
เชเชฎเซเชฏ) เชเซ, เชตเชงเซเชฎเชพเช, เชเซเชก เชเชพเชตเชพ เชเชฐเชคเชพเช เชตเชงเซ เชเซเชฎเซเชชเซเชเซเช เช
เชจเซ เชธเชฎเชเซ เชถเชเชพเชฏ เชคเซเชตเซเช เชเซ. เชถเซเชฆเซเชง Java เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเช เชฎเชพเชเซ เชธเชฎเชเชตเชพเชฎเชพเช เชธเชฐเชณเชคเชพ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ, เชนเซเช เชเซเชเชฒเชฟเชจเชจเชพ เชเชพเชณเชพ เชเชพเชฆเซเชจเซ เชเชพเชณเซเชถ เช
เชจเซ เชฎเชพเชคเซเชฐ เชธเชซเซเชฆ เชเชพเชฆเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเชถ (เชฒเซเชฎเซเชฌเซเชเชจเซ เชญเชพเชตเชจเชพเชฎเชพเช). เชคเซเชฏเชพเช เชฅเซเชกเซ เชเชเซเชธเซเชเซเชเชถเชจ เชชเชฆเซเชงเชคเชฟเช เชนเชถเซ, เชชเชฐเชเชคเซ เชคเซ เชตเชพเชธเซเชคเชตเชฎเชพเช เชเชพเชตเชพ เชชเซเชฐเซเชเซเชฐเชพเชฎเชฐเซเชจเซ เชธเซเชฅเชฟเชฐ เชชเชฆเซเชงเชคเชฟเช เชคเชฐเซเชเซ เชชเชฐเชฟเชเชฟเชค เชเซ, เชคเซเชฅเซ เช เชเช เชจเชพเชจเซ เชเชพเชเชก เชนเชถเซ เชเซ เชตเชพเชจเชเซเชจเซ เชธเซเชตเชพเชฆ เชฌเชเชพเชกเซ เชจเชนเซเช.
เชฆเชธเซเชคเชพเชตเซเช เชฎเชเชเซเชฐเซ เชธเซเชตเชพ เชเซ. เชเซเช เชตเซเชฏเชเซเชคเชฟ เชฆเชธเซเชคเชพเชตเซเช เชฌเชจเชพเชตเซ เชเซ เช
เชจเซ เชคเซเชจเซ เชเชฐเซเชเชพ เชฎเชพเชเซ เชธเชฌเชฎเชฟเช เชเชฐเซ เชเซ, เชเซ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชธเชเชชเชพเชฆเชจเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เช
เชจเซ เชเชเชฐเซ เชฆเชธเซเชคเชพเชตเซเช เชชเชฐ เชธเชเชฎเชค เชฅเชพเชฏ เชเซ. เชฎเชเชเซเชฐเซ เชธเซเชตเชพ เชชเซเชคเซ เชฆเชธเซเชคเชพเชตเซเชเซ เชตเชฟเชถเซ เชเชเชเชชเชฃ เชเชพเชฃเชคเซ เชจเชฅเซ: เชคเซ เชซเชเซเชค เชจเชพเชจเชพ เชตเชงเชพเชฐเชพเชจเชพ เชเชพเชฐเซเชฏเซ เชธเชพเชฅเซ เชฎเชเชเซเชฐเซ เชเชชเชจเชพเชฐเชพเชเชจเซ เชเซเช เชเซ เชเซเชจเซ เช
เชฎเซ เช
เชนเซเช เชงเซเชฏเชพเชจเชฎเชพเช เชฒเชเชถเซเช เชจเชนเซเช.
เชคเซเชฅเซ, เชคเซเชฎเชพเชเชจเชพ เชฆเชฐเซเชเชฎเชพเช เชธเชนเชญเชพเชเซเชเชจเชพ เชชเซเชฐเซเชตเชตเซเชฏเชพเชเซเชฏเชพเชฏเชฟเชค เชธเชฎเซเชน เชธเชพเชฅเซ เชเซเช เชฐเซเชฎ (เชฆเชธเซเชคเชพเชตเซเชเซเชจเซ เช เชจเซเชฐเซเชช) เชเซ. เชจเชฟเชฏเชฎเชฟเชค เชเซเชเซเชธเชจเซ เชเซเชฎ, เชธเชเชฆเซเชถเชพเชฎเชพเช เชเซเชเซเชธเซเช เช เชจเซ เชซเชพเชเชฒเซ เชนเซเชฏ เชเซ เช เชจเซ เชคเซ เชเชตเชพเชฌเซ เช เชฅเชตเชพ เชซเซเชฐเชตเชฐเซเชก เชนเซเช เชถเชเซ เชเซ:
data class ChatMessage(
// nullable ัะฐะบ ะบะฐะบ ะฟะพัะฒะปัะตััั ัะพะปัะบะพ ะฟะพัะปะต persist
val id: Long? = null,
/** ะกััะปะบะฐ ะฝะฐ ะฐะฒัะพัะฐ */
val author: UserReference,
/** ะกะพะพะฑัะตะฝะธะต */
val message: String,
/** ะกััะปะบะธ ะฝะฐ ะฐััะฐัะธ */
// ะธะท-ะทะฐ ะพัะพะฑะตะฝะฝะพััะตะน ัะฒัะทะบะธ JPA+ะกะฃะะ ะฟัะพัะต ะฟะพะดะดะตัะถะธะฒะฐัั ะธ null, ะธ ะฟััััะต ัะฟะธัะบะธ
val files: List<FileReference>? = null,
/** ะัะปะธ ัะฒะปัะตััั ะพัะฒะตัะพะผ, ัะพ ะทะดะตัั ะฑัะดะตั ะพัะธะณะธะฝะฐะป */
val replyTo: ChatMessage? = null,
/** ะัะปะธ ัะฒะปัะตััั ะฟะตัะตััะปะบะพะน, ัะพ ะทะดะตัั ะฑัะดะตั ะพัะธะณะธะฝะฐะป */
val forwardFrom: ChatMessage? = null
)
เชซเชพเชเชฒ เช เชจเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชฒเชฟเชเชเซเชธ เช เช เชจเซเชฏ เชกเซเชฎเซเชจเซเชธเชจเซ เชฒเชฟเชเชเซเชธ เชเซ. เช เชนเซเช เชเชชเชฃเซ เช เชฐเซเชคเซ เชเซเชตเซเช เชเซเช:
typealias FileReference = Long
typealias UserReference = Long
เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชกเซเชเชพ เชเซเชเซเชฒเซเชเชฎเชพเช เชธเชเชเซเชฐเชนเชฟเชค เชฅเชพเชฏ เชเซ เช
เชจเซ REST เชฆเซเชตเชพเชฐเชพ เชชเซเชจเชเชชเซเชฐเชพเชชเซเชค เชฅเชพเชฏ เชเซ. เชซเชพเชเชฒเซ เชฎเชพเชเซ เชชเชฃ เช เช เชเซ: เชซเชพเชเชฒเซ เช
เชจเซ เชคเซเชฎเชจเชพ เชตเชฟเชถเซเชจเซ เชฎเชพเชนเชฟเชคเซ เชเช เช
เชฒเช เชซเชพเชเชฒ เชธเซเชเซเชฐเซเช เชธเซเชตเชพเชฎเชพเช เชฐเชนเซ เชเซ.
เช เชธเซเชตเชพเช เชฎเชพเชเซเชจเชพ เชคเชฎเชพเชฎ เชเซเชฒเซเชธ เชเซ เชญเชพเชฐเซ เชตเชฟเชจเชเชคเซเช. เชเชจเซ เช เชฐเซเชฅ เช เชเซ เชเซ เช เชตเชฟเชจเชเชคเซเชเชจเชพ เชชเชฐเชฟเชตเชนเชจเชจเซ เชเชตเชฐเชนเซเชก เชคเซเชคเซเชฏ-เชชเชเซเชท เชธเซเชตเชพ เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพเชฎเชพเช เชเซ เชธเชฎเชฏ เชฒเซ เชเซ เชคเซเชจเชพ เชเชฐเชคเชพเช เชเชฃเซ เชตเชงเชพเชฐเซ เชเซ. เช เชฎเชพเชฐเซ เชเซเชธเซเช เชฌเซเชจเซเช เชชเชฐ, เชเชตเซ เชธเซเชตเชพเช เชฎเชพเชเซเชจเซ เชธเชพเชฎเชพเชจเซเชฏ เชเซเชฒ เชธเชฎเชฏ 100 ms เชเซ, เชคเซเชฅเซ เช เชฎเซ เชญเชตเชฟเชทเซเชฏเชฎเชพเช เช เชจเชเชฌเชฐเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเชถเซเช.
เชคเชฎเชพเชฎ เชเชฐเซเชฐเซ เชฎเชพเชนเชฟเชคเซ เชธเชพเชฅเซ เชเซเชฒเซเชฒเชพ N เชธเชเชฆเซเชถเชพเช เชชเซเชฐเชพเชชเซเชค เชเชฐเชตเชพ เชฎเชพเชเซ เช เชฎเชพเชฐเซ เชเช เชธเชฐเชณ REST เชจเชฟเชฏเชเชคเซเชฐเช เชฌเชจเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เชเชเชฒเซ เชเซ, เช เชฎเซ เชฎเชพเชจเซเช เชเซเช เชเซ เชซเซเชฐเชจเซเชเชเชจเซเชกเชฎเชพเช เชฎเซเชธเซเช เชฎเซเชกเชฒ เชฒเชเชญเช เชธเชฎเชพเชจ เชเซ เช เชจเซ เชคเชฎเชพเชฎ เชกเซเชเชพ เชฎเซเชเชฒเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เชซเซเชฐเชจเซเช-เชเชจเซเชก เชฎเซเชกเชฒ เชตเชเซเชเซเชจเซ เชคเชซเชพเชตเชค เช เชเซ เชเซ เชซเชพเชเชฒ เช เชจเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชจเซ เชฒเชฟเชเช เชเชฐเชตเชพ เชฎเชพเชเซ เชคเซเชฎเชจเซ เชธเชนเซเช เชกเชฟเชเซเชฐเชฟเชชเซเชเซเชก เชธเซเชตเชฐเซเชชเชฎเชพเช เชฐเชเซ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ:
/** ะ ัะฐะบะพะผ ะฒะธะดะต ะพัะดะฐัััั ัััะปะบะธ ะฝะฐ ัััะฝะพััะธ ะดะปั ััะพะฝัะฐ */
data class ReferenceUI(
/** ะะดะตะฝัะธัะธะบะฐัะพั ะดะปั url */
val ref: String,
/** ะะธะดะธะผะพะต ะฟะพะปัะทะพะฒะฐัะตะปั ะฝะฐะทะฒะฐะฝะธะต ัััะปะบะธ */
val name: String
)
data class ChatMessageUI(
val id: Long,
/** ะกััะปะบะฐ ะฝะฐ ะฐะฒัะพัะฐ */
val author: ReferenceUI,
/** ะกะพะพะฑัะตะฝะธะต */
val message: String,
/** ะกััะปะบะธ ะฝะฐ ะฐััะฐัะธ */
val files: List<ReferenceUI>,
/** ะัะปะธ ัะฒะปัััั ะพัะฒะตัะพะผ, ัะพ ะทะดะตัั ะฑัะดะตั ะพัะธะณะธะฝะฐะป */
val replyTo: ChatMessageUI? = null,
/** ะัะปะธ ัะฒะปัััั ะฟะตัะตััะปะบะพะน, ัะพ ะทะดะตัั ะฑัะดะตั ะพัะธะณะธะฝะฐะป */
val forwardFrom: ChatMessageUI? = null
)
เชเชชเชฃเซ เชจเซเชเซเชจเชพเชจเซ เช เชฎเชฒเชฎเชพเช เชฎเซเชเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ:
interface ChatRestApi {
fun getLast(n: Int): List<ChatMessageUI>
}
UI เชชเซเชธเซเชเชซเชฟเชเซเชธ เชเชเชฒเซ เชซเซเชฐเชจเซเช เชเชจเซเชก เชฎเชพเชเซ DTO เชฎเซเชกเชฒเซเชธ, เชเชเชฒเซ เชเซ, เชเชชเชฃเซ REST เชฆเซเชตเชพเชฐเชพ เชถเซเช เชธเซเชตเชพ เชเชชเชตเซ เชเซเชเช.
เช เชนเซเช เชจเชตเชพเชเชจเซ เชตเชพเชค เช เชเซ เชเซ เช เชฎเซ เชเซเชเชชเชฃ เชเซเช เชเชเชกเซ เชชเชพเชธ เชเชฐเซ เชฐเชนเซเชฏเชพ เชจเชฅเซ เช เชจเซ เชเซเชเชฎเซเชธเซเช/เชเซเชเชฎเซเชธเซเชเชฏเซเชเช เชฎเซเชกเชฒ เชชเชพเชธเซ เชชเชฃ เชจเชฅเซ. เชฎเซเช เช เชเชฐเชพเชฆเชพเชชเซเชฐเซเชตเช เชเชฐเซเชฏเซเช เชเซ เชเซเชฅเซ เชเชฆเชพเชนเชฐเชฃเซเชจเชพ เชเซเชกเชฎเชพเช เชเชกเชฌเชก เชจ เชฅเชพเชฏ (เชเซเชเซเชธ เช เชฒเช เชเซ, เชคเซเชฅเซ เช เชฎเซ เชงเชพเชฐเซ เชถเชเซเช เชเซ เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชซเชเซเชค เชเช เช เชเซ).
เชซเชฟเชฒเซเชธเซเชซเชฟเชเชฒ เชกเชฟเชเซเชฐเซเชถเชจChatMessageUI เชเซเชฒเชพเชธ เช
เชจเซ ChatRestApi.getLast เชฎเซเชฅเชก เชฌเชเชจเซ เชฒเชฟเชธเซเช เชกเซเชเชพ เชชเซเชฐเชเชพเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ เชเซเชฏเชพเชฐเซ เชนเชเซเชเชคเชฎเชพเช เชคเซ เชเชฐเซเชกเชฐ เชเชฐเซเชฒ เชธเซเช เชนเซเชฏ. JDK เชฎเชพเช เช เชเชฐเชพเชฌ เชเซ, เชคเซเชฅเซ เชเชจเซเชเชฐเชซเซเชธ เชธเซเชคเชฐเซ เชคเชคเซเชตเซเชจเซ เชเซเชฐเชฎ เชเชพเชนเซเชฐ เชเชฐเชตเซ (เชเชฎเซเชฐเซ เช
เชจเซ เชฆเซเชฐ เชเชฐเชคเซ เชตเชเชคเซ เชเชฐเซเชกเชฐ เชธเชพเชเชตเชตเซ) เชเชพเชฎ เชเชฐเชถเซ เชจเชนเซเช. เชคเซเชฅเซ เชเซเชฏเชพเช เชเชฐเซเชกเชฐ เชเชฐเซเชฒ เชธเซเชเชจเซ เชเชฐเซเชฐ เชนเซเชฏ เชคเซเชตเชพ เชเชฟเชธเซเชธเชพเชเชฎเชพเช เชธเซเชเชฟเชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ เชคเซ เชธเชพเชฎเชพเชจเซเชฏ เชชเซเชฐเชฅเชพ เชฌเชจเซ เชเช เชเซ (เชคเซเชฏเชพเช เชเช LinkedHashSet เชชเชฃ เชเซ, เชชเชฐเชเชคเซ เช เชเชจเซเชเชฐเชซเซเชธ เชจเชฅเซ).
เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชฎเชฐเซเชฏเชพเชฆเชพ: เช
เชฎเซ เชฎเชพเชจเซ เชฒเชเชถเซเช เชเซ เชเชตเชพเชฌเซ เช
เชฅเชตเชพ เชเซเชฐเชพเชจเซเชธเชซเชฐเชจเซ เชเซเช เชฒเชพเชเชฌเซ เชธเชพเชเชเชณเซ เชจเชฅเซ. เชเชเชฒเซ เชเซ, เชคเซเช เช
เชธเซเชคเชฟเชคเซเชตเชฎเชพเช เชเซ, เชชเชฐเชเชคเซ เชคเซเชฎเชจเซ เชฒเชเชฌเชพเช เชคเซเชฐเชฃ เชธเชเชฆเซเชถเชพเช เชเชฐเชคเชพเช เชตเชงเซ เชจเชฅเซ. เชธเชเชฆเซเชถเชพเชเชจเซ เชเชเซ เชธเชพเชเชเชณ เช
เชเซเชฐเชญเชพเช เชชเชฐ เชชเซเชฐเชธเชพเชฐเชฟเชค เชฅเชตเซ เชเซเชเช.
เชฌเชพเชนเซเชฏ เชธเซเชตเชพเชเชฎเชพเชเชฅเซ เชกเซเชเชพ เชชเซเชฐเชพเชชเซเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชจเซเชเซเชจเชพ APIs เชเซ:
interface ChatMessageRepository {
fun findLast(n: Int): List<ChatMessage>
}
data class FileHeadRemote(
val id: FileReference,
val name: String
)
interface FileRemoteApi {
fun getHeadById(id: FileReference): FileHeadRemote
fun getHeadsByIds(id: Set<FileReference>): Set<FileHeadRemote>
fun getHeadsByIds(id: List<FileReference>): List<FileHeadRemote>
fun getHeadsByChat(): List<FileHeadRemote>
}
data class UserRemote(
val id: UserReference,
val name: String
)
interface UserRemoteApi {
fun getUserById(id: UserReference): UserRemote
fun getUsersByIds(id: Set<UserReference>): Set<UserRemote>
fun getUsersByIds(id: List<UserReference>): List<UserRemote>
}
เชคเซ เชเซเช เชถเชเชพเชฏ เชเซ เชเซ เชฌเชพเชนเซเชฏ เชธเซเชตเชพเช เชถเชฐเซเชเชคเชฎเชพเช เชฌเซเช เชชเซเชฐเซเชธเซเชธเชฟเชเช เชฎเชพเชเซ เชชเซเชฐเชฆเชพเชจ เชเชฐเซ เชเซ, เช เชจเซ เชฌเชเชจเซ เชธเชเชธเซเชเชฐเชฃเซเชฎเชพเช: เชธเซเช เชฆเซเชตเชพเชฐเชพ (เชคเชคเซเชตเซเชจเชพ เชเซเชฐเชฎเชจเซ เชธเชพเชเชตเซเชฏเชพ เชตเชฟเชจเชพ, เช เชจเชจเซเชฏ เชเซ เชธเชพเชฅเซ) เช เชจเซ เชธเซเชเชฟ เชฆเซเชตเชพเชฐเชพ (เชคเซเชฏเชพเช เชกเซเชชเซเชฒเชฟเชเซเชเซเชธ เชนเซเช เชถเชเซ เชเซ - เชเชฐเซเชกเชฐ เชธเชพเชเชตเซเชฒ เชเซ).
เชธเชฐเชณ เช เชฎเชฒเซเชเชฐเชฃเซ
เชจเชฟเชทเซเชเชชเช เช เชฎเชฒเซเชเชฐเชฃ
เช เชฎเชพเชฐเชพ REST เชจเชฟเชฏเชเชคเซเชฐเชเชจเซเช เชชเซเชฐเชฅเชฎ เชจเชฟเชทเซเชเชชเช เช เชฎเชฒเซเชเชฐเชฃ เชฎเซเชเชพเชญเชพเชเชจเชพ เชเชฟเชธเซเชธเชพเชเชฎเชพเช เชเชจเชพ เชเซเชตเซเช เชฆเซเชเชพเชถเซ:
class ChatRestController(
private val messageRepository: ChatMessageRepository,
private val userRepository: UserRemoteApi,
private val fileRepository: FileRemoteApi
) : ChatRestApi {
override fun getLast(n: Int) =
messageRepository.findLast(n)
.map { it.toFrontModel() }
private fun ChatMessage.toFrontModel(): ChatMessageUI =
ChatMessageUI(
id = id ?: throw IllegalStateException("$this must be persisted"),
author = userRepository.getUserById(author).toFrontReference(),
message = message,
files = files?.let { files ->
fileRepository.getHeadsByIds(files)
.map { it.toFrontReference() }
} ?: listOf(),
forwardFrom = forwardFrom?.toFrontModel(),
replyTo = replyTo?.toFrontModel()
)
}
เชฌเชงเซเช เชเซเชฌ เช เชธเซเชชเชทเซเช เชเซ, เช
เชจเซ เช เชเช เชฎเซเชเซ เชตเชคเซเชคเชพ เชเซ.
เช เชฎเซ เชฌเซเช เชชเซเชฐเซเชธเซเชธเชฟเชเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช เช เชจเซ เชฌเซเชเชฎเชพเช เชฌเชพเชนเซเชฏ เชธเซเชตเชพเชฎเชพเชเชฅเซ เชกเซเชเชพ เชชเซเชฐเชพเชชเซเชค เชเชฐเซเช เชเซเช. เชชเชฐเชเชคเซ เชเชชเชฃเซ เชเชคเซเชชเชพเชฆเชเชคเชพเชจเซเช เชถเซเช เชฅเชพเชฏ เชเซ?
เชฆเชฐเซเช เชธเชเชฆเซเชถ เชฎเชพเชเซ, เชฒเซเชเช เชซเซเชฒเซเชก เชชเชฐ เชกเซเชเชพ เชฎเซเชณเชตเชตเชพ เชฎเชพเชเซ UserRemoteApi เชชเชฐ เชเช เชเซเชฒ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ เช เชจเซ เชฌเชงเซ เชเซเชกเชพเชฏเซเชฒ เชซเชพเชเชฒเซ เชฎเซเชณเชตเชตเชพ เชฎเชพเชเซ FileRemoteApi เชชเชฐ เชเช เชเซเชฒ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ. เชเชตเซเช เชฒเชพเชเซ เชเซ. เชเชฃเชพเชตเซ เชฆเชเช เชเซ ChatMessage เชฎเชพเชเซ เชซเซเชฐเชตเชฐเซเชกเชซเซเชฐเซเชฎ เช เชจเซ เชฐเชฟเชชเซเชฒเชพเชฏ เชเซ เชซเซเชฒเซเชกเซเชธ เชเชตเซ เชฐเซเชคเซ เชฎเซเชณเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชเซ เชเชจเชพ เชฎเชพเชเซ เชฌเชฟเชจเชเชฐเซเชฐเซ เชเซเชฒเชจเซ เชเชฐเซเชฐ เชจเชฅเซ. เชชเชฐเชเชคเซ เชคเซเชฎเชจเซ ChatMessageUI เชฎเชพเช เชซเซเชฐเชตเชตเชพเชฅเซ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชฅเชถเซ, เชเชเชฒเซ เชเซ, เชเซเชฒ เชเชพเชเชจเซเชเชฐเซเชธ เชจเซเชเชงเชชเชพเชคเซเชฐ เชฐเซเชคเซ เชตเชงเซ เชถเชเซ เชเซ. เชเซเชฎ เชเชชเชฃเซ เช เชเชพเช เชจเซเชเชงเซเชฏเซเช เชเซ เชคเซเชฎ, เชเชพเชฒเซ เชงเชพเชฐเซเช เชเซ เชเชชเชฃเซ เชชเชพเชธเซ เชตเชงเซ เชฎเชพเชณเซ เชจเชฅเซ เช เชจเซ เชธเชพเชเชเชณ เชคเซเชฐเชฃ เชธเชเชฆเซเชถเชพเช เชธเซเชงเซ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชเซ.
เชชเชฐเชฟเชฃเชพเชฎเซ, เช เชฎเชจเซ เชธเชเชฆเซเชถ เชฆเซเช เชฌเชพเชนเซเชฏ เชธเซเชตเชพเช เชฎเชพเชเซ เชฌเซ เชฅเซ เช เชเซเชฒเซเชธ เช เชจเซ เชธเชเชฆเซเชถเชพเชจเชพ เชธเชฎเชเซเชฐ เชชเซเชเซเช เชฎเชพเชเซ เชเช JPA เชเซเชฒ เชฎเชณเชถเซ. เชเซเชฒเซเชธเชจเซ เชเซเชฒ เชธเชเชเซเชฏเชพ 2*N+1 เชฅเซ 6*N+1 เชธเซเชงเซ เชฌเชฆเชฒเชพเชถเซ. เชตเชพเชธเซเชคเชตเชฟเช เชเชเชฎเซเชฎเชพเช เช เชเซเชเชฒเซเช เชเซ? เชเชพเชฒเซ เชเชนเซเช เชเซ เชเช เชชเซเชทเซเช เชจเซ เชฐเซเชจเซเชกเชฐ เชเชฐเชตเชพ เชฎเชพเชเซ 20 เชธเชเชฆเซเชถเชพเช เชฒเซ เชเซ. เชคเซเชฎเชจเซ เชชเซเชฐเชพเชชเซเชค เชเชฐเชตเชพ เชฎเชพเชเซ, เชคเซ 4 เชฅเซ 10 เชธเซเชเชเชก เชธเซเชงเซ เชฒเซเชถเซ. เชญเชฏเชเชเชฐ! เชนเซเช เชคเซเชจเซ 500 ms เชจเซ เช เชเชฆเชฐ เชฐเชพเชเชตเชพ เชฎเชพเชเชเซ เชเซเช. เช เชจเซ เชคเซเช เชซเซเชฐเชจเซเชเชเชจเซเชกเชฎเชพเช เชธเซเชฎเชฒเซเชธ เชธเซเชเซเชฐเซเชฒเชฟเชเช เชฌเชจเชพเชตเชตเชพเชจเซเช เชธเชชเชจเซเช เชเซเชคเชพ เชนเซเชตเชพเชฅเซ, เช เชเชจเซเชกเชชเซเชเชจเซเช เชฎเชพเชเซเชจเซ เชเชพเชฎเชเซเชฐเซเชจเซ เชเชฐเซเชฐเชฟเชฏเชพเชคเซ เชฌเชฎเชฃเซ เชเชฐเซ เชถเชเชพเชฏ เชเซ.
เชเซเชฃ:
- เชเซเชก เชธเชเชเซเชทเชฟเชชเซเชค เช เชจเซ เชธเซเชต-เชฆเชธเซเชคเชพเชตเซเชเซเชเซเชค เชเซ (เชธเชชเซเชฐเซเช เชเซเชฎเชจเซเช เชธเซเชตเชชเซเชจ).
- เชเซเชก เชธเชฐเชณ เชเซ, เชคเซเชฅเซ เชคเชฎเชพเชฐเซ เชเชพเชคเชจเซ เชชเชเชฎเชพเช เชฎเชพเชฐเชตเชพเชจเซ เชฒเชเชญเช เชเซเช เชคเชเซ เชจเชฅเซ.
- เชฌเซเช เชชเซเชฐเซเชธเซเชธเชฟเชเช เช เชเชฒเชฟเชฏเชจ เชเซเชตเซเช เชฒเชพเชเชคเซเช เชจเชฅเซ เช เชจเซ เชคเซ เชคเชฐเซเชเชฎเชพเช เชเชฐเซเชเซเชจเชฟเชเชฒเซ เชเชเซเชเซเชค เชเซ.
- เชคเชฐเซเชเชฎเชพเช เชซเซเชฐเชซเชพเชฐ เชธเชฐเชณเชคเชพเชฅเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ เช เชจเซ เชคเซ เชธเซเชฅเชพเชจเชฟเช เชนเชถเซ.
เชฎเชพเชเชจเชธ:
เชเซเชฌ เช เชจเชพเชจเชพ เชชเซเชเซเชเซเชจเซ เชเชพเชฐเชฃเซ เชญเชฏเชพเชจเช เชเชพเชฎเชเซเชฐเซ.
เช เช เชญเชฟเชเชฎ เชธเชพเชฎเชพเชจเซเชฏ เชธเซเชตเชพเช เช เชฅเชตเชพ เชชเซเชฐเซเชเซเชเชพเชเชชเซเชธเชฎเชพเช เชเชฃเซ เชตเชพเชฐ เชเซเช เชถเชเชพเชฏ เชเซ. เชเซ เชซเซเชฐเชซเชพเชฐเซ เชเชฐเชตเชพเชจเซ เชเชคเชฟ เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชเซ, เชคเซ เชคเซ เชธเชฟเชธเซเชเชฎเชจเซ เชเชเชฟเชฒ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ เชญเชพเชเซเชฏเซ เช เชฏเซเชเซเชฏ เชเซ. เชคเซ เช เชธเชฎเชฏเซ, เช เชฎเชพเชฐเซ เชเซเชฌ เช เชธเชฐเชณ เชธเซเชตเชพ เชฎเชพเชเซ เชชเซเชฐเชฆเชฐเซเชถเชจ เชญเชฏเชเชเชฐ เชเซ, เชคเซเชฅเซ เช เช เชญเชฟเชเชฎเชจเซ เชฒเชพเชเซ เชฅเชตเชพเชจเซ เช เชตเชเชพเชถ เชเซเชฌ เช เชธเชพเชเชเชกเซ เชเซ.
เชจเชฟเชทเซเชเชชเช เชธเชฎเชพเชเชคเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ
เชคเชฎเซ เชฌเชงเชพ เชธเชเชฆเซเชถเชพเช เชชเชฐ เชธเชฎเชพเชเชคเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเซ เชถเชเซ เชเซ - เช เชคเชฎเชจเซ เชธเชเชฆเซเชถเชพเชเชจเซ เชธเชเชเซเชฏเชพเชจเชพ เชเชงเชพเชฐเซ เชธเชฎเชฏเชจเชพ เชฐเซเชเซเชฏ เชตเชงเชพเชฐเชพเชฅเซ เชเซเชเชเชพเชฐเซ เชฎเซเชณเชตเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเชถเซ. เช เชเชพเชธ เชเชฐเซเชจเซ เชธเชพเชฐเซ เชฐเชธเซเชคเซ เชจเชฅเซ เชเชพเชฐเชฃ เชเซ เชคเซ เชฌเชพเชนเซเชฏ เชธเซเชตเชพ เชชเชฐ เชฎเซเชเชพ เชชเซเช เชฒเซเชกเชฎเชพเช เชชเชฐเชฟเชฃเชฎเชถเซ.
เชธเชฎเชพเชเชคเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เช เชฎเชฒเชฎเชพเช เชฎเซเชเชตเซ เชเซเชฌ เช เชธเชฐเชณ เชเซ:
override fun getLast(n: Int) =
messageRepository.findLast(n).parallelStream()
.map { it.toFrontModel() }
.collect(toList())
เชธเชฎเชพเชเชคเชฐ เชฎเซเชธเซเช เชชเซเชฐเซเชธเซเชธเชฟเชเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ, เช เชฎเชจเซ เชเชฆเชฐเซเชถ เชฐเซเชคเซ 300-700 ms เชฎเชณเซ เชเซ, เชเซ เชจเชฟเชทเซเชเชชเช เช เชฎเชฒเซเชเชฐเชฃ เชเชฐเชคเชพเช เชเชฃเซเช เชธเชพเชฐเซเช เชเซ, เชชเชฐเชเชคเซ เชนเชเซ เชชเชฃ เชชเซเชฐเชคเซเช เชเชกเชชเซ เชจเชฅเซ.
เช เช เชญเชฟเชเชฎ เชธเชพเชฅเซ, userRepository เช เชจเซ fileRepository เชจเซ เชตเชฟเชจเชเชคเซเช เชธเชฟเชเชเซเชฐเชจเชธ เชฐเซเชคเซ เชเชฒเชพเชตเชตเชพเชฎเชพเช เชเชตเชถเซ, เชเซ เชเซเชฌ เชเชพเชฐเซเชฏเชเซเชทเชฎ เชจเชฅเซ. เชเชจเซ เช เซเช เชเชฐเชตเชพ เชฎเชพเชเซ, เชคเชฎเชพเชฐเซ เชเซเชฒ เชฒเซเชเซเชเชฎเชพเช เชเชฃเซ เชซเซเชฐเชซเชพเชฐ เชเชฐเชตเซ เชชเชกเชถเซ. เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, CompletionStage เชฆเซเชตเชพเชฐเชพ (เชเชฐเซเชซ Completable Future):
private fun ChatMessage.toFrontModel(): ChatMessageUI =
CompletableFuture.supplyAsync {
userRepository.getUserById(author).toFrontReference()
}.thenCombine(
files?.let {
CompletableFuture.supplyAsync {
fileRepository.getHeadsByIds(files).map { it.toFrontReference() }
}
} ?: CompletableFuture.completedFuture(listOf())
) { author, files ->
ChatMessageUI(
id = id ?: throw IllegalStateException("$this must be persisted"),
author = author,
message = message,
files = files,
forwardFrom = forwardFrom?.toFrontModel(),
replyTo = replyTo?.toFrontModel()
)
}.get()!!
เชคเซ เชเซเช เชถเชเชพเชฏ เชเซ เชเซ เชถเชฐเซเชเชคเชฎเชพเช เชธเชฐเชณ เชฎเซเชชเชฟเชเช เชเซเชก เชเชเชพ เชธเชฎเชเซ เชถเชเชพเชฏ เชคเซเชตเซเช เชฌเชจเซ เชเชฏเซเช เชเซ. เช เชเชเชฒเชพ เชฎเชพเชเซ เชเซ เชเชพเชฐเชฃ เชเซ เช เชฎเชพเชฐเซ เชเซเชฏเชพเชเชฅเซ เชชเชฐเชฟเชฃเชพเชฎเซเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชคเซเชฏเชพเชเชฅเซ เชฌเชพเชนเซเชฏ เชธเซเชตเชพเชเชจเชพ เชเซเชฒเซเชธเชจเซ เช เชฒเช เชเชฐเชตเชพ เชชเชกเซเชฏเชพ เชนเชคเชพ. เช เชชเซเชคเซ เชเชฐเชพเชฌ เชจเชฅเซ. เชชเชฐเชเชคเซ เชเซเชฒเซเชธเชจเซเช เชธเชเชฏเซเชเชจ เชเซเชฌ เชญเชตเซเชฏ เชฒเชพเชเชคเซเช เชจเชฅเซ เช เชจเซ เชคเซ เชเช เชฒเชพเชเซเชทเชฃเชฟเช เชชเซเชฐเชคเชฟเชเซเชฐเชฟเชฏเชพเชถเซเชฒ "เชจเซเชกเชฒ" เชเซเชตเซเช เชฒเชพเชเซ เชเซ.
เชเซ เชคเชฎเซ เชเซเชฐเซเชเซเชจเซเชธเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ, เชคเซ เชฌเชงเซเช เชตเชงเซ เชฏเซเชเซเชฏ เชฆเซเชเชพเชถเซ:
private fun ChatMessage.toFrontModel(): ChatMessageUI =
join(
{ userRepository.getUserById(author).toFrontReference() },
{ files?.let { fileRepository.getHeadsByIds(files)
.map { it.toFrontReference() } } ?: listOf() }
).let { (author, files) ->
ChatMessageUI(
id = id ?: throw IllegalStateException("$this must be persisted"),
author = author,
message = message,
files = files,
forwardFrom = forwardFrom?.toFrontModel(),
replyTo = replyTo?.toFrontModel()
)
}
เชเซเชฏเชพเช:
fun <A, B> join(a: () -> A, b: () -> B) =
runBlocking(IO) {
awaitAll(async { a() }, async { b() })
}.let {
it[0] as A to it[1] as B
}
เชธเซเชฆเซเชงเชพเชเชคเชฟเช เชฐเซเชคเซ, เชเชตเซ เชธเชฎเชพเชเชคเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ, เช เชฎเชจเซ 200-400 ms เชฎเชณเชถเซ, เชเซ เชชเชนเซเชฒเชพเชฅเซ เช เช เชฎเชพเชฐเซ เช เชชเซเชเซเชทเชพเชเชจเซ เชจเชเซเช เชเซ.
เชเชฎเชจเชธเซเชฌเซ, เชเชตเซ เชธเชพเชฐเซ เชธเชฎเชพเชเชคเชฐเชคเชพ เช เชธเซเชคเชฟเชคเซเชตเชฎเชพเช เชจเชฅเซ, เช เชจเซ เชเซเชเชตเชตเชพ เชฎเชพเชเซเชจเซ เชเชฟเชเชฎเชค เชเชเชฆเชฎ เชเซเชฐเซเชฐ เชเซ: เชเช เช เชธเชฎเชฏเซ เชฎเชพเชคเซเชฐ เชฅเซเชกเชพ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเช เชเชพเชฎ เชเชฐเซ เชเซ, เชคเซเชฏเชพเชฐเซ เชตเชฟเชจเชเชคเซเชเชจเซ เชฌเซเชฐเซเช เชธเซเชตเชพเช เชชเชฐ เชเชตเชถเซ, เชเซ เชเซเชเชชเชฃ เชฐเซเชคเซ เชธเชฎเชพเชเชคเชฐ เชฐเซเชคเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ เชจเชนเซเช, เชคเซเชฅเซ เช เชฎเซ เช เชฎเชพเชฐเชพ เชเชฆเชพเชธเซ 4 s เชชเชฐ เชชเชพเชเชพ เชเชตเชถเซ.
เชเชตเซ เชธเซเชตเชพเชจเซ เชเชชเชฏเซเช เชเชฐเชคเซ เชตเชเชคเซ เชฎเชพเชฐเซเช เชชเชฐเชฟเชฃเชพเชฎ 1300 เชธเชเชฆเซเชถเชพเชเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชฎเชพเชเซ 1700โ20 ms เชเซ. เช เชชเซเชฐเชฅเชฎ เช เชฎเชฒเซเชเชฐเชฃ เชเชฐเชคเชพเช เชตเชงเซ เชเชกเชชเซ เชเซ, เชชเชฐเชเชคเซ เชนเชเซ เชชเชฃ เชธเชฎเชธเซเชฏเชพ เชนเชฒ เชเชฐเชคเซเช เชจเชฅเซ.
เชธเชฎเชพเชเชคเชฐ เชชเซเชฐเชถเซเชจเซเชจเชพ เชตเซเชเชฒเซเชชเชฟเช เชเชชเชฏเซเชเซเชเซ เชคเซเชคเซเชฏ-เชชเชเซเชท เชธเซเชตเชพเช เชฌเซเช เชชเซเชฐเซเชธเซเชธเชฟเชเช เชชเซเชฐเชฆเชพเชจ เชเชฐเชคเซ เชจเชฅเซ เชคเซ เชถเซเช? เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชคเชฎเซ เชเชจเซเชเชฐเชซเซเชธ เชชเชฆเซเชงเชคเชฟเชเชจเซ เช เชเชฆเชฐ เชฌเซเช เชชเซเชฐเซเชธเซเชธเชฟเชเช เช เชฎเชฒเซเชเชฐเชฃเชจเชพ เช เชญเชพเชตเชจเซ เชเซเชชเชพเชตเซ เชถเชเซ เชเซ:
interface UserRemoteApi {
fun getUserById(id: UserReference): UserRemote
fun getUsersByIds(id: Set<UserReference>): Set<UserRemote> =
id.parallelStream()
.map { getUserById(it) }.collect(toSet())
fun getUsersByIds(id: List<UserReference>): List<UserRemote> =
id.parallelStream()
.map { getUserById(it) }.collect(toList())
}
เชเซ เชคเชฎเซ เชญเชตเชฟเชทเซเชฏเชจเชพ เชธเชเชธเซเชเชฐเชฃเซเชฎเชพเช เชฌเซเช เชชเซเชฐเซเชธเซเชธเชฟเชเช เชเซเชตเชพเชจเซ เชเชถเชพ เชฐเชพเชเชคเชพ เชนเซเชต เชคเซ เชเชจเซ เช
เชฐเซเชฅ เชฅเชพเชฏ เชเซ.
เชเซเชฃ:
- เชธเชเชฆเซเชถ-เชเชงเชพเชฐเชฟเชค เชธเชฎเชพเชเชคเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชธเชฐเชณเชคเชพเชฅเซ เชฒเชพเชเซ เชเชฐเซ.
- เชธเชพเชฐเซ เชฎเชพเชชเชจเซเชฏเชคเชพ.
เชตเชฟเชชเชเซเชท:
- เชธเชฎเชพเชเชคเชฐ เชตเชฟเชตเชฟเชง เชธเซเชตเชพเชเชจเซ เชตเชฟเชจเชเชคเซเช เชชเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชคเซ เชตเชเชคเซ เชคเซเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชฎเชพเชเชฅเซ เชกเซเชเชพ เชธเชเชชเชพเชฆเชจเชจเซ เช เชฒเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐเชฟเชฏเชพเชค.
- เชคเซเชคเซเชฏ-เชชเชเซเชท เชธเซเชตเชพเช เชชเชฐ เชญเชพเชฐ เชตเชงเชพเชฐเซ.
เชคเซ เชเซเช เชถเชเชพเชฏ เชเซ เชเซ เชฒเชพเชเซ เชชเชกเชตเชพเชจเซ เช เชตเชเชพเชถ เชฒเชเชญเช เชจเชฟเชทเซเชเชชเช เช เชญเชฟเชเชฎ เชเซเชเชฒเซ เช เชเซ. เชเซ เชคเชฎเซ เช เชจเซเชฏ เชฒเซเชเซเชจเชพ เชจเชฟเชฐเซเชฆเชฏ เชถเซเชทเชฃเชจเซ เชเชพเชฐเชฃเซ เชคเชฎเชพเชฐเซ เชธเซเชตเชพเชจเชพ เชชเซเชฐเชฆเชฐเซเชถเชจเชจเซ เชเชฃเซ เชตเชเชค เชตเชงเชพเชฐเชตเชพ เชฎเชพเชเชเชคเชพ เชนเซเชต เชคเซ เชธเชฎเชพเชเชคเชฐ เชตเชฟเชจเชเชคเซ เชชเชฆเซเชงเชคเชฟเชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ เชคเซ เช เชฐเซเชฅเชชเซเชฐเซเชฃ เชเซ. เช เชฎเชพเชฐเชพ เชเชฆเชพเชนเชฐเชฃเชฎเชพเช, เชชเซเชฐเชฆเชฐเซเชถเชจเชฎเชพเช 2,5 เชเชฃเซ เชตเชงเชพเชฐเซ เชฅเชฏเซ เชเซ, เชชเชฐเชเชคเซ เช เชธเซเชชเชทเซเชเชชเชฃเซ เชชเซเชฐเชคเซเช เชจเชฅเซ.
เชเซเชถเซเชเช
เชคเชฎเซ เชฌเชพเชนเซเชฏ เชธเซเชตเชพเช เชฎเชพเชเซ JPA เชจเซ เชญเชพเชตเชจเชพเชฎเชพเช เชเซเชถเซเชเช เชเชฐเซ เชถเชเซ เชเซ, เชเชเชฒเซ เชเซ, เชชเซเชฐเชพเชชเซเชค เชตเชธเซเชคเซเชเชจเซ เชธเชคเซเชฐเชจเซ เช เชเชฆเชฐ เชธเซเชเซเชฐ เชเชฐเซ เชถเชเซ เชเซ เชเซเชฅเซ เชเชฐเซเชจเซ เชคเซเชจเซ เชซเชฐเซเชฅเซ เชชเซเชฐเชพเชชเซเชค เชจ เชฅเชพเชฏ (เชฌเซเช เชชเซเชฐเซเชธเซเชธเชฟเชเช เชฆเชฐเชฎเชฟเชฏเชพเชจ เชธเชนเชฟเชค). เชคเชฎเซ เชเชตเชพ เชเซเชถ เชเชพเชคเซ เชฌเชจเชพเชตเซ เชถเชเซ เชเซ, เชคเชฎเซ เชคเซเชจเชพ @Cacheable เชธเชพเชฅเซ เชธเซเชชเซเชฐเชฟเชเชเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชเซ, เชเชชเชฐเชพเชเชค เชคเชฎเซ เชนเชเชฎเซเชถเชพ EhCache เชเซเชตเซ เชคเซเชฏเชพเชฐ เชเซเชถเชจเซ เชเชพเชคเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชเซ.
เชเช เชธเชพเชฎเชพเชจเซเชฏ เชธเชฎเชธเซเชฏเชพ เช เชนเชถเซ เชเซ เชเซเชถ เชนเชฟเช เชนเซเชฏ เชคเซ เช เชเชชเชฏเซเชเซ เชเซ. เช เชฎเชพเชฐเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เชฒเซเชเช เชเซเชทเซเชคเซเชฐ เชชเชฐ เชนเชฟเช เชฅเชตเชพเชจเซ เชธเชเชญเชพเชตเชจเชพ เชเซ (เชเชพเชฒเซ เชเชนเซเช, 50%), เชชเชฐเชเชคเซ เชซเชพเชเชฒเซ เชชเชฐ เชฌเชฟเชฒเชเซเชฒ เชนเชฟเช เชฅเชถเซ เชจเชนเซเช. เช เช เชญเชฟเชเชฎ เชเซเชเชฒเชพเช เชธเซเชงเชพเชฐเชพเช เชชเซเชฐเชฆเชพเชจ เชเชฐเชถเซ, เชชเชฐเชเชคเซ เชคเซ เชชเซเชฐเชญเชพเชตเชฎเชพเช เชงเชฐเชฎเซเชณเชฅเซ เชซเซเชฐเชซเชพเชฐ เชเชฐเชถเซ เชจเชนเซเช (เช เชจเซ เช เชฎเชจเซ เชธเชซเชณเชคเชพเชจเซ เชเชฐเซเชฐ เชเซ).
เชเชจเซเชเชฐเชธเซเชธเชจ (เชฒเชพเชเชฌเชพ) เชเซเชถเชจเซ เชเชเชฟเชฒ เช เชฎเชพเชจเซเชฏเชคเชพ เชคเชฐเซเชเชจเซ เชเชฐเซเชฐ เชเซ. เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ, เชคเชฎเซ เชเชจเซเชเชฐเชธเซเชธเชจ เชเซเชถเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชชเชฐเซเชซเซเชฐเซเชฎเชจเซเชธ เชธเชฎเชธเซเชฏเชพเช เชเชเซเชฒเชตเชพ เชฎเชพเชเซ เชเซเชเชฒเซ เชชเชพเชเชณเชฅเซ เชจเซเชเซ เชเชตเชถเซ, เชคเซเชเชฒเซเช เชธเชพเชฐเซเช.
เชเซเชฃ:
- เชเซเชก เชฌเชฆเชฒเซเชฏเชพ เชตเชฟเชจเชพ เชเซเชถเซเชเชเชจเซ เช เชฎเชฒ เชเชฐเซ.
- เชเชคเซเชชเชพเชฆเชเชคเชพเชฎเชพเช เชเชฃเซ เชตเชเชค เชตเชงเชพเชฐเซ (เชเซเชเชฒเชพเช เชเชฟเชธเซเชธเชพเชเชฎเชพเช).
เชตเชฟเชชเชเซเชท:
- เชเซ เชเซเชเซ เชฐเซเชคเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชคเซ เชเชพเชฎเชเซเชฐเซเชฎเชพเช เชเชเชพเชกเซ เชฅเชตเชพเชจเซ เชถเชเซเชฏเชคเชพ.
- เชฎเซเชเซ เชฎเซเชฎเชฐเซ เชเชตเชฐเชนเซเชก, เชเชพเชธ เชเชฐเซเชจเซ เชฒเชพเชเชฌเชพ เชเซเชถ เชธเชพเชฅเซ.
- เชเชเชฟเชฒ เช เชฎเชพเชจเซเชฏเชคเชพ, เชญเซเชฒเซ เชเซเชฎเชพเช เชฐเชจเชเชพเชเชฎเชฎเชพเช เชชเซเชจเชเชเชคเซเชชเชพเชฆเชจ เชเชฐเชตเชพ เชฎเชพเชเซ เชฎเซเชถเซเชเซเชฒ เชธเชฎเชธเซเชฏเชพเช เชคเชฐเชซ เชฆเซเชฐเซ เชเชถเซ.
เชเชฃเซ เชตเชพเชฐ, เชเซเชถเชจเซ เชเชชเชฏเซเช เชซเชเซเชค เชกเชฟเชเชพเชเชจ เชธเชฎเชธเซเชฏเชพเชเชจเซ เชเชกเชชเชฅเซ เชชเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชฅเชพเชฏ เชเซ. เชเชจเซ เช เชฐเซเชฅ เช เชจเชฅเซ เชเซ เชคเซเชจเซ เชเชชเชฏเซเช เชฅเชตเซ เชเซเชเช เชจเชนเซเช. เชเซ เชเซ, เชคเชฎเชพเชฐเซ เชนเชเชฎเซเชถเชพ เชคเซเชฎเชจเซ เชธเชพเชฅเซ เชธเชพเชตเชงเชพเชจเซเชชเซเชฐเซเชตเช เชตเชฐเซเชคเชตเซเช เชเซเชเช เช เชจเซ เชชเซเชฐเชฅเชฎ เชชเชฐเชฟเชฃเชพเชฎเซ เชชเชฐเชซเซเชฐเซเชฎเชจเซเชธ เชเซเชเชจเชจเซเช เชฎเซเชฒเซเชฏเชพเชเชเชจ เชเชฐเชตเซเช เชเซเชเช เช เชจเซ เชชเชเซ เช เชจเชฟเชฐเซเชฃเชฏ เชฒเซเชตเซ เชเซเชเช.
เช เชฎเชพเชฐเชพ เชเชฆเชพเชนเชฐเชฃเชฎเชพเช, เชเซเชถ เชฒเชเชญเช 25% เชจเซ เชชเซเชฐเชญเชพเชต เชตเชงเชพเชฐเซ เชชเซเชฐเชฆเชพเชจ เชเชฐเชถเซ. เชคเซ เช เชธเชฎเชฏเซ, เชเซเชถเชฎเชพเช เชเชฃเชพ เชฌเชงเชพ เชเซเชฐเชซเชพเชฏเชฆเชพ เชเซ, เชคเซเชฅเซ เชนเซเช เชคเซเชจเซ เช เชนเซเช เชเชชเชฏเซเช เชเชฐเซเชถ เชจเชนเซเช.
เชชเชฐเชฟเชฃเชพเชฎเซ
เชคเซเชฅเซ, เช เชฎเซ เชฌเซเช เชชเซเชฐเซเชธเซเชธเชฟเชเชเชจเซ เชเชชเชฏเซเช เชเชฐเชคเซ เชธเซเชตเชพเชจเชพ เชจเชฟเชทเซเชเชชเช เช เชฎเชฒเซเชเชฐเชฃ เช เชจเซ เชคเซเชจเซ เชเชกเชชเซ เชฌเชจเชพเชตเชตเชพเชจเซ เชเซเชเชฒเซเช เชธเชฐเชณ เชฐเซเชคเซ เชชเชฐ เชงเซเชฏเชพเชจ เชเชชเซเชฏเซเช.
เช เชฌเชงเซ เชชเชฆเซเชงเชคเชฟเชเชจเซ เชฎเซเชเซเชฏ เชซเชพเชฏเชฆเซ เช เชธเชฐเชณเชคเชพ เชเซ, เชเซเชฎเชพเชเชฅเซ เชเชฃเชพ เชธเซเชเชฆ เชชเชฐเชฟเชฃเชพเชฎเซ เชเซ.
เช เชชเชฆเซเชงเชคเชฟเชเชจเซ เชธเชพเชฎเชพเชจเซเชฏ เชธเชฎเชธเซเชฏเชพ เช เชจเชฌเชณเซ เชเชพเชฎเชเซเชฐเซ เชเซ, เชฎเซเชเซเชฏเชคเซเชตเซ เชชเซเชเซเชเซเชจเชพ เชเชฆเชจเซ เชเชพเชฐเชฃเซ. เชคเซเชฅเซ, เชเซ เช เชเชเซเชฒเซ เชคเชฎเชจเซ เช เชจเซเชเซเชณ เชจ เชเชตเซ, เชคเซ เชคเซ เชตเชงเซ เชเชฎเซเชฒ เชชเชฆเซเชงเชคเชฟเช เชงเซเชฏเชพเชจเชฎเชพเช เชฒเซเชตเชพ เชฏเซเชเซเชฏ เชเซ.
เชคเซเชฏเชพเช เชฌเซ เชฎเซเชเซเชฏ เชฆเชฟเชถเชพเช เชเซ เชเซเชฎเชพเช เชคเชฎเซ เชเชเซเชฒเซ เชถเซเชงเซ เชถเชเซ เชเซ:
- เชกเซเชเชพ เชธเชพเชฅเซ เช เชธเซเชฎเซเชณ เชเชพเชฐเซเชฏ (เชชเซเชฐเชพเชกเชพเชเชฎ เชถเชฟเชซเซเชเชจเซ เชเชฐเซเชฐ เชเซ, เชคเซเชฅเซ เช เชฒเซเชเชฎเชพเช เชเชฐเซเชเชพ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชจเชฅเซ);
- เชธเชฟเชเชเซเชฐเชจเชธ เชชเซเชฐเซเชธเซเชธเชฟเชเช เชเชพเชณเชตเซ เชฐเชพเชเชคเซ เชตเชเชคเซ เชฌเซเชเชจเซเช เชตเชฟเชธเซเชคเชฐเชฃ.
เชฌเซ
เชเซเชธเชจเซเช เชตเชฟเชธเซเชคเชฐเชฃ เชฌเชพเชนเซเชฏ เชเซเชฒเซเชธเชจเซ เชธเชเชเซเชฏเชพเชฎเชพเช เชฎเซเชเชพ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช เชเชเชพเชกเซ เชเชฐเชถเซ เช
เชจเซ เชคเซ เช เชธเชฎเชฏเซ เชเซเชกเชจเซ เชธเชฟเชเชเซเชฐเชจเชธ เชฐเชพเชเชถเซ. เชฒเซเชเชจเซ เชเชเชณเชจเซ เชญเชพเช เช เชตเชฟเชทเชฏเชจเซ เชธเชฎเชฐเซเชชเชฟเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ.
เชธเซเชฐเซเชธ: www.habr.com