1

我目前正在使用 Java 在 Restfull 架构下开发应用程序。在我的 web rest 服务、另一个 web service soap 和 android 客户端之间的交互过程中,我遇到了一个非常大的问题。

经过几次测试,我意识到客户端有时会在操作仍在处理时返回失败,并且对于上面提到的两个服务之间的服务消费也是如此,仅仅是因为那个案例调用是阻塞的。

为了解决这个问题,我会这样进行:当客户端向服务器发送操作时,服务器会立即响应该请求已被处理。然后客户每次都必须测试他的操作状态,直到它通知用户是好的。

现在我担心的是我只会为此创建一个线程;但我找不到一个好的设计和技术......提前感谢您的帮助。

4

1 回答 1

0

您将侦听来自客户端轮询状态的调用(在服务器的一个端点上),并让您的消费者线程实现一个getStatus方法,同时更新 run 方法中的状态。关于消费者线程,粗略的实现如下所示:

public class ConsumerThread implements Runnable{
    private int status = 0;
    private Random rand = new Random();
    private final CountDownLatch startSignal;

    public ConsumerThread(CountDownLatch latch){
        this.startSignal = latch;
    }

    public int getStatus() {
        return status;
    }

    private void setStatus(int status) {
        this.status = status;
    }

    public void run() {
        try {
            this.startSignal.await();
            while (true){
                this.setStatus(rand.nextInt(10));
            }
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }       
    }
}

然后尝试一个简单的 main 方法(我实现了一个CountDownLatch让我的所有线程同时启动,这不是强制性的):

public class ThreadMain{
    private static List<ConsumerThread> consumers = new ArrayList<ConsumerThread>();

    public static void main(String[] args) {
        int NUM_THREAD = 15;
        ExecutorService executor = Executors.newFixedThreadPool(NUM_THREAD);

        CountDownLatch latch = new CountDownLatch(NUM_THREAD);
        ConsumerThread buffer = new ConsumerThread(latch);
        for (int i = 0; i < NUM_THREAD; i++){
            consumers.add(buffer);
            executor.execute(buffer);
            latch.countDown();
            buffer = new ConsumerThread(latch);
        }

        for (int i = 0; i < 100; i++){
            System.out.println("Status for Thread 0: " + getStatusId(0));
            System.out.println("Status for Thread 14: " + getStatusId(14));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static int getStatusId(int index){
        return consumers.get(index).getStatus();
    }
}

样本输出:

Status for Thread 0: 5
Status for Thread 14: 0
Status for Thread 0: 7
Status for Thread 14: 2
Status for Thread 0: 7
Status for Thread 14: 4
Status for Thread 0: 6
Status for Thread 14: 3
于 2017-03-16T13:09:12.863 回答