2013-08-05 3 views
2

Я пытаюсь определить статический метод в интерфейсе службы, чтобы сделать вызов rpc. Но это не позволяет мне это делать. здесь я вставив мой кодRPC вызов - статические методы не работают

класс Client

public void sendDomesticData(String product,String dma,String yrmnths,String dist,String metrics) { 
    String url = GWT.getModuleBaseURL() + "domesticservice"; 
    domesticServiceAsync = (DomesticServiceAsync) GWT.create(DomesticService.class); 
    ServiceDefTarget endpoint = (ServiceDefTarget) domesticServiceAsync; 
    endpoint.setServiceEntryPoint(url); 
    domesticServiceAsync.sendDomesticData(product,dma,yrmnths,dist,metrics,new Domestichandler<Void>()); 
} 

public class Domestichandler<Void> implements AsyncCallback<Void> { 
    @Override 
    public void onFailure(Throwable caught) { 
     String error = caught.getMessage(); 
     System.out.println(error); 
    } 

    public void onSuccess(Void result) { 
     System.out.println("perfect"); 
    } 
} 

Service 
public interface DomesticService extends RemoteService { 
    public void sendDomesticData(String product,String dma,String yrmnths,String dist,String metrics); 

} 

public interface DomesticServiceAsync { 
    void sendDomesticData(String product,String dma,String yrmnths,String dist,String metrics,AsyncCallback<Void> callback); 
} 

стороне сервера -

public void sendDomesticData(String product, String dma, String yrmnths, String dist, String metrics) { 
    System.out.println(product); 
} 

В основном я пытаюсь отправить значения из переднего интерфейса на стороне сервера, и я не требуется любое возвращаемое значение. Но значения, переданные на сервер, должны храниться глобально в классе сервера, поэтому я могу получить доступ к этим значениям в другом методе. Я пытался изменить все значения senddomestic на статические, но это не позволит мне это сделать? Зачем?

+0

Вы указали неправильный ответ как принятый ответ, потому что он даст вам ошибки - см. Мой собственный ответ. – mlkammer

ответ

1

Поскольку RemoteServiceServlet необходимо каким-либо образом вызвать ваши методы обслуживания, а реализация ожидает методы экземпляра. Но это не должно препятствовать назначению данных метода статическим полям. Просто имейте в виду многопоточность.

+0

Хранение данных в статических полях вашего экземпляра RemoteServiceServlet НЕ является тем, как идти, и даст вам ошибки, потому что у вас нет контроля над тем, какой экземпляр сервлета он будет храниться - см. Мой собственный ответ. – mlkammer

1

GWT всегда использует методы экземпляра для вызовов RPC, статические методы в этом случае невозможны.

Что важно понимать о GWT, так это то, что любые экземпляры RemoteServiceServlet создаются и поддерживаются контейнером сервлетов (например, Tomcat). Контейнер сервлета может создать несколько экземпляров сервлета при запуске (Tomcat по умолчанию создает 6 экземпляров RemoteServiceServlet), а затем использует балансировку нагрузки, чтобы определить, какой сервлет обрабатывает запрос RPC в определенный момент времени. В зависимости от настроек, конечно, у вас мало контроля над тем, какой экземпляр RemoteServiceServlet точно будет обрабатывать определенный запрос RPC.

Поэтому, если вы хотите хранить информацию на стороне сервера глобально используя RPC вызовы, идея, предложенная яппи использовать статические поля вашей реализации RemoteServiceServlet является плохой идеей. Вы не знаете, какие из экземпляров RemoteServiceServlet, поддерживаемые сервером, содержат ваши статические данные, и любые последующие вызовы для извлечения данных приведут к неустойчивым результатам.

У вас есть несколько вариантов. Хранение информации в базе данных (или что-то подобное) является наиболее простым вариантом, но из вашего сообщения я предполагаю, что вы хотите что-то более простое. Одноэлементный класс, который содержит ваши данные, - это, вероятно, путь. Поточно-пример:

public class DataContainer 
{ 
    private static DataContainer _singleton; 

    private String _dataField1; 

    public static synchronized DataContainer getInstance() 
    { 
    if (_singleton == null) 
     _singleton = new DataContainer(); 
    return _singleton; 
    } 

    public synchronized String getDataField1() 
    { 
    return _dataField1; 
    } 

    public synchronized void setDataField1(String dataField1) 
    { 
    _dataField1 = dataField1; 
    } 
} 

Затем в реализации на стороне сервера вашего вызова RPC вы могли бы сделать что-то вроде:

public void sendDomesticData(String product, String dma, String yrmnths, String dist, String metrics) 
{ 
    DataContainer.getInstance().setDataField1(product); 
} 

Таким образом, если существует несколько экземпляров сервлет они будут одни и те singleton экземпляра DataContainer, что дает вам возможность хранить данные во всем мире. Я надеюсь, что это поможет вам.

Смежные вопросы