我有几个读者,我在不断阅读rfid标签。我想用数据库中的内容检查这些标签。我有一个spring应用,它使用runnables连接并从读者那里获取信息。我正在将标签添加到队列中。我有一个单独运行的rest api,此应用程序将使用它。我想在阅读器应用程序运行时使用此api多次检查数据库以及向数据库添加信息。我该怎么做呢?
我已经尝试了多种方法,例如使用completablefuture,尝试使用webflux,使用resttemplate进行api调用,使用webclient进行api调用,但是似乎没有任何效果。我有一个执行程序服务,可以从主要位置调用读者。每个阅读器都创建有一个可运行的。 Runnable创建Reader并调用该函数。在该功能中,将启动2个可运行任务。在这些任务之一中,我想调用其余的api。我将尝试并包含所有必需的代码。
这是从main调用的类:
@Component
@Scope("prototype")
public class CSLReader{
public CSLReader(String ipAddress){
this.ipAddress=ipAddress;
}
public CSLReader(String ipAddress, String deviceName, int power, int
notifyPort, int dwellTime ) throws InterruptedException{
this.ipAddress=ipAddress;
this.deviceName=deviceName;
this.power=power;
this.notifyPort=notifyPort;
this.TagBuffer = new LinkedList<TagInfo>();
//this.taglist=new ArrayBlockingQueue<TagInfo>();
this.dwellTime=dwellTime;
//Start();
}
public void StartAsync() throws InterruptedException, IOException{
Runnable task = new Runnable() {
@Override
public void run() {
try {
StartInventory();
} catch (Exception ex) {
System.out.print("start
inventory thread could not start: "+ex.getLocalizedMessage());
ex.printStackTrace();
}
}
};
Runnable task2 = new Runnable() {
@Override
public void run() {
try {
StartTCPClient();
} catch (Exception ex) {
System.out.print("start
tcpclient thread could not start: "+ex.getMessage());
}
}
};
tcpClientThread = new Thread(task2, "TCPClientThread");
tcpClientThread.setDaemon(true);
tcpClientThread.start();
inventoryThread = new Thread(task, "InventoryThread");
inventoryThread.setDaemon(true);
inventoryThread.start();
}
我在服务文件中有此文件:
@Async
public CompletableFuture<BmwvehicleTest> findVehicle(String rfidtag) throws InterruptedException{
log.info("trying to find a vehicle test by rfidtag");
String getUrl=String.format("http://localhost/api/tag/", rfidtag);
BmwvehicleTest results= restTemplate.getForObject(getUrl,BmwvehicleTest.class);
Thread.sleep(2000L);
return CompletableFuture.completedFuture(results);
}
然后我尝试在主要的原型组件中调用它:
public void StartInventory() throws InterruptedException,
ExecutionException{
ArrayBlockingQueue<TagInfo> taglist= new ArrayBlockingQueue<TagInfo>(10000);
synchronized (TagBuffer) {
if (TagBuffer.size() >= 10000){
TagBuffer.remove();
}
//test tag
TagInfo tag2= new TagInfo(51.2f, 2, "192.168.68.68", "Test Reader", new Date(), 0, "E200287878787878787", "3400");
if (tag2 != null){
TagBuffer.add(tag2);
System.out.println("tag added to tag buffer");
log.info("the tag is: "+tag2.epc);
CompletableFuture<BmwvehicleTest> num1=asyncServices.findVehicle(tag2.epc);
}
}
}
我希望该应用程序继续从阅读器接收信息,并在接收到标签时将标签添加到队列中,然后检查是否在数据库中,如果需要,我希望将该位置添加到数据库中。在发生这种情况的同时,我仍然希望该应用程序继续从读者那里接收信息。