У меня есть абстрактный класс-заглушка, который должен быть подклассом для добавления аннотаций пружины.
abstract class ConsumerStub<TYPE>{
val receivedMessages: MutableMap<String, TYPE> = ConcurrentHashMap()
open fun processMessage(@Payload payload: TYPE, record: ConsumerRecord<String, *>) {
this.receivedMessages[record.key()] = payload
}
fun receivedMessageWithKey(key: String): Boolean = this.receivedMessages.contains(key)
fun receivedMessageWithKeyCallable(key: String): Callable<Boolean> = Callable { receivedMessageWithKey(key) }
fun getReceiveMessageWithKey(key: String): TYPE? = this.receivedMessages[key]
fun reset() {
this.receivedMessages.clear()
}
}
, например:
open class WorkflowRequestConsumerStub: ConsumerStub<InternalWorkflowRequest>() {
@KafkaListener(
id = "xyzRequestConsumerStub",
topics = ["abc-workflow-requests"]
)
override fun processMessage(
@Payload payload: InternalWorkflowRequest,
record: ConsumerRecord<String, *>
) {
super.processMessage(payload, record)
}
}
Я вижу действительно странное поведение с receiveMessages,После некоторой отладки, которую я понял, кажется, что есть 2 экземпляра receiveMessages.
stub.reset () выдает исключение нулевого указателя
после изменения кода для инициализации receiveMessages в reset (), processMessage () и receiveMessageWithKey () видят 2 разных ReceiveMessages с разными objectIds.
что происходит?В java у подкласса должен быть доступ ко всем защищенным членам в super, поэтому я предполагаю, что то же самое относится и к kotlin.
UPDATE: это работает, как и ожидалось, при определении абстрактных и переопределенных параметроввляемых сообщений в реализациях.Это действительно отстой, если это так, как это должно быть сделано в kotlin.В этом случае для реализации нет необходимости заботиться о карте.