如何在可运行程序中进行rest api调用?

时间:2019-01-15 16:22:43

标签: java spring spring-boot concurrency spring-async

我有几个读者,我在不断阅读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);
}
}
}

我希望该应用程序继续从阅读器接收信息,并在接收到标签时将标签添加到队列中,然后检查是否在数据库中,如果需要,我希望将该位置添加到数据库中。在发生这种情况的同时,我仍然希望该应用程序继续从读者那里接收信息。

0 个答案:

没有答案