Hallo!
Ich habe wohl ein Thread/Timing Problem?
Über 16 Methoden erhalte ich Boolesche Werte.
Ich halte diese Summe als Integer (16bit eben)
Wenn nun eine Methode einen Wert empfängt, update ich den Integer und warte mit der Weiterverarbeitung des Integer noch 50 Millisekunden (falls noch andere Methoden auslösen) und sende den Int Wert per UDP weiter.
Nun kann aber anscheinend passieren, das manche Werte von Methoden nicht übernommen werden. Ich vermute eben das ich ein Thread / Timing Problem habe, denn das passiert nur, wenn die Methoden fast zur selben Zeit Werte empfangen:
Methoden die auslösen:
usw. für die anderen 15 Methoden.
Running is nur aktiv, wenn die UDP Verbindung steht. Die ist fast immer "on".
Die Klasse snmpSA selbst:
Und die Methode, die den Integer Wert aufbereitet:
Wenn also nicht busy, wird gesendet, ansonsten nicht.
Nach dem senden ist busy wieder false.
Da der Integer auch nach dem Senden nicht den Wert der Methoden angenommen hat, kanns nur so sein, dass die Methode "sendChannel(int channel, boolean value)" gar nie aufgerufen wird.
Optimal wäre es, wenn die Klasse zum senden der UDP Pakete ein eigener Thread wäre und die zentrale Integer Variable als gemeinsame Variable genutzt werden könnte.
Oder wie löst man sonst das Problem?
Vielen Dank
Ich habe wohl ein Thread/Timing Problem?
Über 16 Methoden erhalte ich Boolesche Werte.
Ich halte diese Summe als Integer (16bit eben)
Wenn nun eine Methode einen Wert empfängt, update ich den Integer und warte mit der Weiterverarbeitung des Integer noch 50 Millisekunden (falls noch andere Methoden auslösen) und sende den Int Wert per UDP weiter.
Nun kann aber anscheinend passieren, das manche Werte von Methoden nicht übernommen werden. Ich vermute eben das ich ein Thread / Timing Problem habe, denn das passiert nur, wenn die Methoden fast zur selben Zeit Werte empfangen:
Methoden die auslösen:
Java:
sa = new snmpSA(getPropertyAddress(), getPropertyPort(),
getPropertyCommunity(), this);
public void onChannel1(boolean value) {
if (running)
sa.sendChannel(1, value);
}
Running is nur aktiv, wenn die UDP Verbindung steht. Die ist fast immer "on".
Die Klasse snmpSA selbst:
Java:
public snmpSA(final String host, final int port, String community,
final NetworkListener networklistener) {
executor = Executors.newSingleThreadScheduledExecutor();
Address tHost = GenericAddress.parse(host + "/" + port);
try {
transport = new DefaultUdpTransportMapping();
} catch (IOException e) {
e.printStackTrace();
}
snmp = new Snmp(transport);
try {
transport.listen();
} catch (IOException e) {
e.printStackTrace();
}
target = new CommunityTarget();
target.setCommunity(new OctetString(community));
target.setAddress(tHost);
target.setRetries(2);
target.setTimeout(1500);
target.setVersion(SnmpConstants.version1);
this.networkListener = networklistener;
hostAliveTimer = executor.scheduleAtFixedRate(new Runnable() {
public void run() {
snmpGet(EnumSAOID.Location.toString());
}
}, 20, 20, TimeUnit.SECONDS);
Und die Methode, die den Integer Wert aufbereitet:
Java:
public void sendChannel(int channel, boolean value) {
if (value) {
setSaStatus(saStatus | (1 << channel - 1));
} else {
setSaStatus(saStatus & ~(1 << channel - 1));
}
if (!busy) {
busy = true;
snmpSetValue(50);
}
}
Nach dem senden ist busy wieder false.
Da der Integer auch nach dem Senden nicht den Wert der Methoden angenommen hat, kanns nur so sein, dass die Methode "sendChannel(int channel, boolean value)" gar nie aufgerufen wird.
Optimal wäre es, wenn die Klasse zum senden der UDP Pakete ein eigener Thread wäre und die zentrale Integer Variable als gemeinsame Variable genutzt werden könnte.
Oder wie löst man sonst das Problem?
Vielen Dank