首页 > 解决方案 > 标准PBEByteEncryptor 锁

问题描述

为什么 StandardPBEByteEncryptor 会锁定一个对象?

"pool-2-thread-115" - Thread t@169
   java.lang.Thread.State: BLOCKED
        at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.decrypt(StandardPBEByteEncryptor.java:1035)
        - waiting to lock <55a2b29b> (a javax.crypto.Cipher) owned by "pool-2-thread-114" t@168
        at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.decrypt(StandardPBEStringEncryptor.java:725)
        at org.jasypt.util.text.BasicTextEncryptor.decrypt(BasicTextEncryptor.java:112)
        at com.ahmetk.tims.statcalculator.kafka.consumer.XMPPTxnLogKafkaClient.process(XMPPTxnLogKafkaClient.java:129)
        at com.ahmetk.tims.statcalculator.kafka.consumer.XMPPTxnLogKafkaClient.lambda$processMessage$0(XMPPTxnLogKafkaClient.java:107)
        at com.ahmetk.tims.statcalculator.kafka.consumer.XMPPTxnLogKafkaClient$$Lambda$227/859670158.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
        - locked <21b2529d> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"pool-2-thread-114" - Thread t@168
   java.lang.Thread.State: RUNNABLE
        at sun.security.provider.DigestBase.engineDigest(DigestBase.java:158)
        at java.security.MessageDigest$Delegate.engineDigest(MessageDigest.java:592)
        at java.security.MessageDigest.digest(MessageDigest.java:365)
        at com.sun.crypto.provider.PBES1Core.deriveCipherKey(PBES1Core.java:272)
        at com.sun.crypto.provider.PBES1Core.init(PBES1Core.java:244)
        at com.sun.crypto.provider.PBEWithMD5AndDESCipher.engineInit(PBEWithMD5AndDESCipher.java:221)
        at javax.crypto.Cipher.init(Cipher.java:1394)
        at javax.crypto.Cipher.init(Cipher.java:1327)
        at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.decrypt(StandardPBEByteEncryptor.java:1036)
        - locked <55a2b29b> (a javax.crypto.Cipher)
        at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.decrypt(StandardPBEStringEncryptor.java:725)
        at org.jasypt.util.text.BasicTextEncryptor.decrypt(BasicTextEncryptor.java:112)
        at com.ahmetk.tims.statcalculator.kafka.consumer.XMPPTxnLogKafkaClient.process(XMPPTxnLogKafkaClient.java:129)
        at com.ahmetk.tims.statcalculator.kafka.consumer.XMPPTxnLogKafkaClient.lambda$processMessage$0(XMPPTxnLogKafkaClient.java:107)
        at com.ahmetk.tims.statcalculator.kafka.consumer.XMPPTxnLogKafkaClient$$Lambda$227/859670158.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

标签: javaencryption

解决方案


使用多线程解密 当我们在多核机器上运行时,我们希望并行处理解密。为了获得良好的性能,我们可以使用 PooledPBEStringEncryptor 和 setPoolSize() API 创建一个消化池。它们中的每一个都可以由不同的线程并行使用:

PooledPBEStringEncryptor 加密器 = new PooledPBEStringEncryptor(); 加密器.setPoolSize(4); encryptor.setPassword("一些随机数据"); encryptor.setAlgorithm("PBEWithMD5AndTripleDES"); 将池大小设置为等于机器的核心数是一种很好的做法。加解密的代码和前面的一样。


推荐阅读