慕田峪4524236
2023-10-13 10:05:50
我有一個(gè)監(jiān)聽(tīng)主題的類(TopicListenerImp),我想從remoteListen函數(shù)獲取消息,并將其作為參數(shù)提供給其他服務(wù)類中的另一個(gè)非靜態(tài)函數(shù)。 @Component public class TopicListenerImp implements TopicListener { private NotificationService notificationService; private SubscriptionRepository subscriptionRepository; private SubscriptionRules subscriptionRules; private NFInstancesService nfInstancesService; private Ignite ignite; public TopicListenerImp( SubscriptionRules subscriptionRules, NotificationService notificationService, SubscriptionRepository subscriptionRepository, Ignite ignite, NFInstancesService nfInstancesService) { this.subscriptionRules = subscriptionRules; this.notificationService = notificationService; this.subscriptionRepository = subscriptionRepository; this.nfInstancesService = nfInstancesService; this.ignite = ignite; } @Bean public void startTopicListening() { IgniteMessaging rmtMsg = ignite.message(ignite.cluster().forLocal()); rmtMsg.remoteListen( "SUSPEND", (nodeId, msg) -> { notifyIfSubscriptionExist((String) msg); //here where I used the message that comes from topic return true; }); } public void notifyIfSubscriptionExist(String msg) { List<String> nfInstanceIdSubscriptionId = parseNfInstanceIdSubscriptionId(msg); Optional<NFProfile> nfProfile = nfInstancesService.getNFInstance(nfInstanceIdSubscriptionId.get(0)); Optional<SubscriptionData> subscriptionDataOptional = subscriptionRepository.getSubscriptionData(nfInstanceIdSubscriptionId.get(1)); }); }但我收到以下錯(cuò)誤; Caused by: org.apache.ignite.binary.BinaryObjectException: Failed to serialize object etc.當(dāng)我靜態(tài)注入字段時(shí),它起作用了。但是當(dāng)我這樣做時(shí),IDE 會(huì)發(fā)出警告“不要從構(gòu)造函數(shù)方法更新靜態(tài)變量”。
1 回答

瀟瀟雨雨
TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊
RemoteListen采用一個(gè)謂詞,該謂詞將被序列化并通過(guò)網(wǎng)絡(luò)發(fā)送到遠(yuǎn)程節(jié)點(diǎn)。當(dāng)您在其實(shí)現(xiàn)中調(diào)用非靜態(tài)方法時(shí),它會(huì)使整個(gè)this
對(duì)象被序列化。它可能會(huì)導(dǎo)致意外行為和通過(guò)網(wǎng)絡(luò)發(fā)送大量數(shù)據(jù)。
一般來(lái)說(shuō),不建議通過(guò)網(wǎng)絡(luò)發(fā)送 lambda 函數(shù),因?yàn)樗鼈兊男蛄谢蕾囉?VM,并且無(wú)法讓您控制實(shí)際發(fā)送的內(nèi)容。如果您想通過(guò)網(wǎng)絡(luò)發(fā)送謂詞,則創(chuàng)建一個(gè)實(shí)現(xiàn)謂詞接口的類并使用該類的實(shí)例。
如果不需要集群中的所有節(jié)點(diǎn)都訂閱該主題,那么localListen就足夠了。
添加回答
舉報(bào)
0/150
提交
取消