Я использую Java для создания приложения для управления сетью.В этом приложении я устанавливаю связь с сетевыми устройствами, используя библиотеку SNMP4j (для протокола snmp).Итак, я должен сканировать определенные значения сетевых устройств, используя этот протокол, и поместить результат в файл для кеширования.В какой-то момент я решил сделать свое приложение многопоточным и назначить устройство потоку.Я создал класс, который реализует работающий интерфейс, а затем сканирует значения, которые я хочу для каждого устройства.
Когда я запускаю этот класс в одиночку, он работает нормально.но когда я помещаю несколько потоков одновременно, вывод выводит из строя, он выводит дополнительные или не по порядку выходные данные в файлы.Теперь мне интересно, связана ли эта проблема с вводом / выводом или с коммуникацией.
Здесь я приведу часть кода, чтобы вы могли видеть, что я делаю, и помогать мне понять, что не так.
public class DeviceScanner implements Runnable{
private final SNMPCommunicator comm;
private OutputStreamWriter out;
public DeviceScanner(String ip, OutputStream output) throws IOException {
this.device=ip;
this.comm = new SNMPV1Communicator(device);
oids=MIB2.ifTableHeaders;
out = new OutputStreamWriter(output);
}
@Override
public void run(){
//Here I use the communicator to request for desired data goes something like ...
String read=""
for (int j=0; j<num; j++){
read= comm.snmpGetNext(oids);
out.write(read);
this.updateHeaders(read);
}
out.flush();
//...
}
}
некоторые из ожидаемых выходных данных будут выглядеть примерно так:
1.3.6.1.2.1.1.1.0 = SmartSTACK ELS100-S24TX2M
1.3.6.1.2.1.1.2.0 = 1.3.6.1.4.1.52.3.9.1.10.7
1.3.6.1.2.1.1.3.0 = 26 дней, 22: 35: 02,31
1.3.6.1.2.1.1.4.0 = admin
1.3.6.1.2.1.1.5.0 = els
1.3.6.1.2.1.1.6.0 = компьютерная комната
, но вместо этогоя получаю что-то вроде (меняется):
1.3.6.1.2.1.1.1.0 = SmartSTACK ELS100-S24TX2M
1.3.6.1.2.1.1.2.0 = 1.3.6.1.4.1.52.3.9.1.10.7
1.3.6.1.2.1.1.4.0 = admin
1.3.6.1.2.1.1.5.0 = els
1.3.6.1.2.1.1.3.0 = 26 дней, 22: 35: 02.31
1.3.6.1.2.1.1.6.0 = компьютерная комната
1.3.6.1.2.1.1.1.0 = SmartSTACK ELS100-S24TX2M
1.3.6.1.2.1.1.2.0 = 1.3.6.1.4.1.52.3.9.1.10.7
* В настоящее время у меня есть один файл для каждого сканера устройства.я получаю их из списка IP, похоже, это.Я также использую небольшой пул потоков, чтобы сохранить ограниченное количество потоков одновременно.
<code>
for (String s: ips){
output= new FileOutputStream(new File(path+s));
threadpool.add(new DeviceScanner(s, output));
}