Contextualização:
Tenho uma pagina que lista uma descrição e um status (on/off).
As informações vão ser sincronizadas com um Smartphone(Android).
O status pode ser alterado pelo smartphone ou pela página.
Se alterar pelo smartphone, atualiza a página.
Solução:
Eu criei uma aplicação que é um servidor que fica escutando os clientes que se conectam a ele e distrubui a mensagem para todos os clientes.
Entao, tenho o servidor e a aplicação web e o smartphone conectados.
Versões:
JSF(2.0.4) e Primefaces(3.3.1)
Problema encontrado:
Consegui distribuir as mensagens corretamente.
O problema é que não estou conseguindo atualizar a página quando recebo uma mensagem.
Não entendo muito de JSF, estou fazendo nessas tecnologias mais pra aprender mesmo, isso não é nada comercial.
Usei este exemplo do Herbert para fazer minha aplicação: http://uaihebert.com/aplicacao-web-completa-tomcat-jsf-primefaces-jpa-hibernate/
Fontes(Ficou um pouco grande, posso anexar os projetos se necessário):
//Página JSF que quero atualizar
<h:body>
<ui:composition template="/pages/protected/templates/master.xhtml">
<ui:define name="divMain">
<h3>#{bundle.homeEdit}: <h:outputText value="#{homeMB.homeWithRooms.description}" /></h3>
<h:form id="personsForm">
<p:dataTable id="homesTable" value="#{homeMB.homeWithRooms.roomList}" var="room" emptyMessage="#{bundle.noRecords}" paginator="true" rows="10"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="5,10,15">
<p:column>
<f:facet name="header">
<h:outputText value="#{bundle.room}" />
</f:facet>
<h:outputText value="#{room.description}" />
</p:column>
<p:column>
<p:commandButton value="#{bundle.roomListObject}" icon="ui-icon-contact" ajax="false"
action="#{roomMB.listObjects()}">
<f:setPropertyActionListener target="#{roomMB.room}" value="#{room}" />
</p:commandButton>
</p:column>
</p:dataTable>
</h:form>
</ui:define>
</ui:composition>
</h:body>
//ManagedBean da página que quero atualizar
@ManagedBean(name="roomMB")
@ApplicationScoped
public class RoomMB extends AbstractMB implements Serializable {
private static final long serialVersionUID = 1L;
public static final String INJECTION_NAME = "#{roomMB}";
public static final String SELECTED_ROOM = "selectedRoom";
private Room room;
private Room roomWithObjects;
private RoomFacade facade;
private List<Room> roomList;
public String listObjects() {
ELFlash.getFlash().put(SELECTED_ROOM, room);
return "/pages/protected/admin/object/objectIndex.xhtml";
}
public Room getRoomWithObjects() {
roomWithObjects = getRoomFacade().findRoomWithAllObjects(room.getId());
return roomWithObjects;
}
public RoomFacade getRoomFacade() {
if (facade == null) {
facade = new RoomFacade();
}
return facade;
}
//gets e sets ocultado
}
//Essa classe conecta ao servidor que distribui mensagens qnd inicializar o jboss
@ManagedBean(eager=true)
@ApplicationScoped
public class ClientSocketMB implements Serializable {
private static final long serialVersionUID = 1L;
private MyClient client;
public ClientSocketMB() {
client = new MyClient(Constants.SOCKET_HOST, Constants.SOCKET_PORT);
try {
client.execute();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//Cliente que se conecta ao servidor
public class MyClient {
private String host;
private int port;
public MyClient(String host, int port) {
this.host = host;
this.port = port;
}
public void execute() throws UnknownHostException, IOException {
Socket client = new Socket(this.host, this.port);
// thread para receber mensagens do servidor
MyReceiver r = new MyReceiver(client.getInputStream());
new Thread(r).start();
}
}
//Quem vai receber a mensagem, onde quero atualizar a pagina
public class MyReceiver implements Runnable {
private InputStream server;
public MyReceiver(InputStream server) {
this.server = server;
}
@Override
public void run() {
Scanner s = new Scanner(this.server);
while (s.hasNextLine()) {
//Mensagem recebida, aqui onde queria atualizar a pagina
System.out.println(s.nextLine());
}
}
}