Java同步来自JavaScript的异步调用

时间:2017-08-01 11:02:39

标签: java servlets asynchronous synchronized volatile

我有很多来自客户端的异步GET调用和一个POST请求。 在我的servlet获得POST请求之后,我想以另一种方式处理即将到来的GET调用。这是我尝试但失败的原因:

import Contacts

let contact = CNMutableContact()
contact.birthday = DateComponents(calendar: Calendar.current,year: 1887, month: 1, day: 1)
contact.contactType = CNContactType.person
contact.givenName = "John"
contact.familyName = "Appleseed"

contact.imageData = Data() // The profile picture as a NSData object

let homeEmail = CNLabeledValue(label:CNLabelHome, value: NSString(string: "john@example.com"))
let workEmail = CNLabeledValue(label:CNLabelWork, value: NSString(string: "j.appleseed@icloud.com"))
contact.emailAddresses = [homeEmail, workEmail]

contact.phoneNumbers = [CNLabeledValue(label:CNLabelPhoneNumberiPhone, value:CNPhoneNumber(stringValue:"(408) 555-0126"))]

let homeAddress = CNMutablePostalAddress()
homeAddress.street = "1 Infinite Loop"
homeAddress.city = "Cupertino"
homeAddress.state = "CA"
homeAddress.postalCode = "95014"
contact.postalAddresses = [CNLabeledValue(label:CNLabelHome, value:homeAddress)]

func encodeContactToJson(contact: CNContact)->Data?{
    var contactDict = [String:Any]()
    if let birthday = contact.birthday?.date {
        let df = DateFormatter()
        df.dateFormat = "yyyy-MM-dd"
        contactDict["birthday"] = df.string(from: birthday)
    }
    contactDict["givenName"] = contact.givenName
    contactDict["familyName"] = contact.familyName
    if let imageData = contact.imageData {
        contactDict["image"] = imageData.base64EncodedString()
    }
    if contact.emailAddresses.count > 0 {
        var emailAddresses = [String:String]()
        for (index, emailAddress) in contact.emailAddresses.enumerated() {
            emailAddresses[emailAddress.label ?? "email\(index)"] = (emailAddress.value as String)
        }
        contactDict["emailAddresses"] = emailAddresses
    }
    if contact.phoneNumbers.count > 0 {
        var phoneNumbers = [String:String]()
        for (index, phoneNumber) in contact.phoneNumbers.enumerated() {
            phoneNumbers[phoneNumber.label ?? "phone\(index)"] = phoneNumber.value.stringValue
        }
        contactDict["phoneNumbers"] = phoneNumbers
    }
    if contact.postalAddresses.count > 0 {
        var postalAddresses = [String:String]()
        for (index, postalAddress) in contact.postalAddresses.enumerated() {
            postalAddresses[postalAddress.label ?? "postal\(index)"] = (CNPostalAddressFormatter.string(from: postalAddress.value, style: .mailingAddress))
        }
        contactDict["postalAddresses"] = postalAddresses
    }
    return try? JSONSerialization.data(withJSONObject: contactDict)
}

func decodeContactsJson(jsonData: Data)->CNContact?{
    if let jsonDict = (try? JSONSerialization.jsonObject(with: jsonData)) as? [String:Any] {
        let contact = CNMutableContact()
        print(jsonDict)
        return contact as CNContact
    } else {
        return nil
    }
}

if let jsonContact = encodeContactToJson(contact: contact) {
    print(decodeContactsJson(jsonData: jsonContact) ?? "Decoding failed")
} else {
    print("Encoding failed")
}

我的问题是GET调用运行的线程无法识别volatile变量的变化。

1 个答案:

答案 0 :(得分:1)

非常罕见的设计......

无论如何,当你有一个原始类型变量的并发读/写时,你可能想要使用Atomic *数据类型。

volatile proceed = true可以解决问题:

AtomicBoolean proceed = new AtomicBoolean(true)替换为if (proceed)

if (proceed.get())替换为proceed = false;

proceed.set(false)替换为SELECT c.COMPANY_ID FROM Company AS c WHERE NOT EXISTS ( SELECT 1 FROM CompanyRoleMapping AS r WHERE c.COMPANY_ID = r.COMPANY_ID AND r.USER_ROLE = 'admin' )