Łukasz Chomiuk
2013-02-11 07:22:52 UTC
Åukasz Chomiuk [https://community.jboss.org/people/lukhash] created the discussion
"Closing jms connection in EJB componenets"
To view the discussion, visit: https://community.jboss.org/message/796973#796973
--------------------------------------------------------------
Hi.
I writing a simple chat application using EJB3 and JMS. The app is almost done but I have problem with closing connection. When I close connection in one user then i can't close connection in the other. This is code of my app.
Client side
@Stateful
@LocalBean
public class ChatClientBean implements ChatClientLocal{
   private String owner;
   private MessageContainer container = null;
   /* Zmienne poÅÄ czeniowe */
   private String destination = null;
   private final static String C_FACTORY = "/ConnectionFactory";
   private Context ic;
   private TopicConnectionFactory tcf = null;
   private TopicConnection connection;Â
   private Topic topic;
   private TopicSession subSession;
   private TopicSubscriber subscriber;
   private TopicSession pubSession;
   private TopicPublisher publisher;
   /* -------------------- */
   public ChatClientBean(){}
   @Override
   public void init(String topicName, String owner, MessageContainer container){
       try{
           this.destination = topicName;
           this.owner = owner;
           this.container = container;
           ic = new InitialContext();
           tcf = (TopicConnectionFactory) ic.lookup(C_FACTORY);
           connection = tcf.createTopicConnection();
           pubSession = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
           subSession = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
           topic = (Topic) ic.lookup(destination);
           subscriber = subSession.createSubscriber(topic);
           publisher = pubSession.createPublisher(topic);
           subscriber.setMessageListener(this);
           System.out.println("Zaincjalizowano ChatClientBean dla "+owner);
       }catch(JMSException ex){
           System.out.println("Blad przy incjalizacji MessageProccesora");
           ex.printStackTrace();
       }catch(NamingException ex){
           System.out.println("Blad JNDI");
       }
   }
   @Override
   public void onMessage(Message message) {
       try{
               TextMessage tm = (TextMessage) message;
               if(container!= null){
                   container.service(tm.getText());
               }
               System.out.println("Odebrano przez : "+owner+ " : " + tm.getText());
           }catch(JMSException ex){
               System.out.println("Blad JMS przy odbieraniu");
               ex.printStackTrace();
           }
   }
   @Override
   public void sendMessage(String message){
       try{
           TextMessage tm = pubSession.createTextMessage(message);
           publisher.publish(tm);
           System.out.println("Wiadomosc wyslana przez "+owner+" : "+ tm.getText());
       }catch(JMSException ex){
           ex.printStackTrace();
       }
   }
   @Override
   public void start(){
       try{
           connection.start();
       }catch(JMSException ex){
           System.out.println("Blad przy startowaniu polaczenia");
       }
   }
   @Override
   public void close(){
       try{
           if(pubSession != null){
               pubSession.close();
           }
           if(subSession != null){
               subSession.close();
           }
           if(connection != null){
               connection.close();
           }
           if(ic != null){
               ic.close();
           }
       }catch(JMSException ex){
           System.out.println("Blad przy zamykaniu polaczenia : "+ owner);
           ex.printStackTrace();
       }catch(NamingException ex){
           System.out.println("Blad JNDI przy zamykaniu polaczenia "+owner);
       }
   }
   /* GETTERY i SETTERY */
   public String getOwner() {
       return owner;
   }
   public void setOwner(String owner) {
       this.owner = owner;
   }
   public MessageContainer getContainer() {
       return container;
   }
   public void setContainer(MessageContainer container) {
       this.container = container;
   }
   public String getDestination() {
       return destination;
   }
   public void setDestination(String destination) {
       this.destination = destination;
   }
   /* ----------------- */
Operator side
@Stateful
@LocalBean
public class ChatOperatorBean implements ChatOperatorLocal{
   private String owner;
   private ClientsContainer container;
    /* Zmienne poÅÄ czeniowe */
   private String destination = null;
   private final static String C_FACTORY = "/ConnectionFactory";
   private Context ic;
   private TopicConnectionFactory tcf = null;
   private TopicConnection connection;Â
   private Topic topic;
   private TopicSession subSession;
   private TopicSubscriber subscriber;
   private TopicSession pubSession;
   private TopicPublisher publisher;
   /* -------------------- */
   @Override
   public void init(String topicName, String owner, ClientsContainer container){
       try{
           this.destination = topicName;
           this.owner = owner;
           this.container = container;
           ic = new InitialContext();
           tcf = (TopicConnectionFactory) ic.lookup(C_FACTORY);
           connection = tcf.createTopicConnection();
           pubSession = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
           subSession = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
           topic = (Topic) ic.lookup(destination);
           subscriber = subSession.createSubscriber(topic);
           publisher = pubSession.createPublisher(topic);
           subscriber.setMessageListener(this);
           System.out.println("Zaincjalizowano ChatOperatorBean dla "+owner);
       }catch(JMSException ex){
           System.out.println("Blad przy incjalizacji MessageProccesora : "+owner);
           ex.printStackTrace();
       }catch(NamingException ex){
           System.out.println("Blad JNDI : "+owner);
           ex.printStackTrace();
       }
   }
   @Override
   public void onMessage(Message message) {
       try{
           TextMessage tm = (TextMessage) message;
           if(container!= null){
               container.service(tm.getText());
           }
           System.out.println("Odebrano przez : "+owner+" : "+ tm.getText());
       }catch(JMSException ex){
           System.out.println("Blad JMS przy odbieraniu u : "+owner);
           ex.printStackTrace();
       }
   }
   @Override
   public void sendMessage(String message){
       try{
           TextMessage tm = pubSession.createTextMessage(message);
           publisher.publish(tm);
           System.out.println("Wiadomosc wyslana przez "+owner+" : "+ tm.getText());
       }catch(JMSException ex){
           ex.printStackTrace();
       }
   }
   public void start(){
       try{
           connection.start();
       }catch(JMSException ex){
           System.out.println("Blad przy startowaniu polaczenia : "+owner);
       }
   }
   @Override
   public void close(){
       try{
           if(pubSession != null){
               pubSession.close();
           }
           if(subSession != null){
               subSession.close();
           }
           if(connection != null){
               connection.close();
           }
           if(ic != null){
               ic.close();
           }
       }catch(JMSException ex){
           System.out.println("Blad przy zamykaniu polaczenia : "+ owner);
           ex.printStackTrace();
       }catch(NamingException ex){
           System.out.println("Blad JNDI przy zamykaniu polaczenia "+owner);
       }
   }
   /* GETTERY i SETTERY */
   public String getOwner() {
       return owner;
   }
   public void setOwner(String owner) {
       this.owner = owner;
   }
   public ClientsContainer getContainer() {
       return container;
   }
   public void setContainer(ClientsContainer container) {
       this.container = container;
   }
   public String getDestination() {
       return destination;
   }
   public void setDestination(String destination) {
       this.destination = destination;
   }
   /* ----------------- */
client.xhtml
<h:body style="background-color: #99ff66">
       <h:outputStylesheet name="css/default.css" />
       <h:form id="form" >
           <p:outputPanel id="panel" >
               <h:panelGrid columns="2" cellpadding="5" id="startPanel" rendered="#{client.startPanelVisible}" >
                               <h:outputLabel value="Nazwa" for="nick" style="font-weight: bold;" />
                               <p:inputText value="#{client.nick}" id="nick" />
                               <p:commandButton value="Rozpocznij" actionListener="#{client.startChat()}" process="@this,nick" update="panel" id="start"/>
               </h:panelGrid>
               <p:panel header="WiadomoÅci" id="chatboxPanel" rendered="#{client.chatPanelVisible}">
                   <h:panelGroup id="chatbox">
                       <ui:repeat value="#{client.container.messages}" var="item">
                           #{item}
                           <br/>
                           <p:separator/>
                       </ui:repeat>
                       <p:poll interval="1" update="chatbox" />
                   </h:panelGroup>
               </p:panel>
               <p:outputPanel id="chatPanel" rendered="#{client.chatPanelVisible}">
                   <p:inputText value="#{client.message}"
                                styleClass="messageInput"
                                style="margin-top: 5px;width: 310px;"
                                />
                   <p:commandButton value="Send"
                                    actionListener="#{client.send()}"
                                    oncomplete="$('.messageInput').val('').focus()"
                                    />
                   <p:commandButton actionListener="#{client.closeChat()}" process="@this" update="panel"
                                    value="Close"
                                    />
               </p:outputPanel>
           </p:outputPanel>
       </h:form>
   </h:body>
operator.xhtml
<h:body>
       <h:outputStylesheet name="css/defaultOperator.css" />
       Zalogowany jako : #{logOn.operator.firstName} #{logOn.operator.lastName}
       <p:separator />
       <h:form id="form" prependId="false">
               <p:selectOneButton value="#{operator.viewController.selectedPanel}" style="margin-bottom: 10px;" >
                   <f:selectItem itemValue="0" itemLabel="Pierwszy" />
                   <f:selectItem itemValue="1" itemLabel="Kod na stronÄ" />
                   <f:selectItem itemValue="2" itemLabel="Czaty" />
                   <p:ajax event="change" update="form" />
               </p:selectOneButton>
               <p:outputPanel id="panel0" rendered="#{operator.viewController.getVisible(0)}">
               </p:outputPanel>
               <p:outputPanel id="panel1" rendered="#{operator.viewController.getVisible(1)}">
                   <p:fieldset styleClass="fieldset">
                       <h:panelGrid columns="1" >
                           <h:outputText value="Wklej ten kod w sekcji head strony" />
                           <h:inputTextarea id="trackingCode" readonly="true" rows="10" cols="40" value="#{operator.tr}"/>
                       </h:panelGrid>
                   </p:fieldset>
               </p:outputPanel>
               <p:outputPanel id="panel2" rendered="#{operator.viewController.getVisible(2)}" autoUpdate="true">
                   <p:outputPanel styleClass="left">
                       <p:panel header="Status" styleClass="statusBox">
                           <p:commandButton actionListener="#{operator.startChat()}" value="PoÅÄ cz" />
                           <p:commandButton actionListener="#{operator.closeChat()}" value="RozÅÄ cz" />
                       </p:panel>
                       <p:panel header="OczekujÄ cy klienci" styleClass="clientBox">
                           <p:outputPanel id="clientPanel" >
                               <ui:repeat value="#{operator.container.notServiced}" var="item" >
                                   <h:outputText value="#{item.clientName}" />
                                   <p:commandButton styleClass="startbtn" value=">>" actionListener="#{operator.startWithClient(item.clientName)}" />
                                   <p:separator />
                               </ui:repeat>
                           </p:outputPanel>
                       </p:panel>
                   </p:outputPanel>
                   <p:panel header="Aktywne chaty" id="activeChats" styleClass="chatTabs">
                       <p:tabView id="tabView" value="#{operator.container.serviced}" var="item">
                           <p:tab id="clientTab" title="#{item.clientName}" >
                              <p:outputPanel >
                                   <p:panel header="WiadomoÅci" id="chatboxPanel" styleClass="messageBox">
                                       <p:outputPanel id="chatbox" >
                                            <ui:repeat value="#{item.messages}" var="msg">
                                                <b>#{msg.from} : </b>#{msg.text}
                                                <p:separator />
                                            </ui:repeat>
                                       </p:outputPanel>
                                    </p:panel>
                                  <p:poll interval="1" update="chatbox" />
                               </p:outputPanel>
                               <p:outputPanel id="chatPanel" >
                                   <p:inputText value="#{item.currentMessage}"
                                            styleClass="messageInput"
                                            style="margin-top: 5px;width: 310px;"
                                            />
                                   <p:commandButton value="Send"
                                                actionListener="#{operator.send(item.clientName,item.currentMessage)}"
                                                oncomplete="$('.messageInput').val('').focus()"
                                                styleClass="button"
                                                />
                               </p:outputPanel>
                           </p:tab>
                       </p:tabView>
                   </p:panel>
               </p:outputPanel>
           </h:form>
   </h:body>
--------------------------------------------------------------
Reply to this message by going to Community
[https://community.jboss.org/message/796973#796973]
Start a new discussion in EJB3 at Community
[https://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2029]
"Closing jms connection in EJB componenets"
To view the discussion, visit: https://community.jboss.org/message/796973#796973
--------------------------------------------------------------
Hi.
I writing a simple chat application using EJB3 and JMS. The app is almost done but I have problem with closing connection. When I close connection in one user then i can't close connection in the other. This is code of my app.
Client side
@Stateful
@LocalBean
public class ChatClientBean implements ChatClientLocal{
   private String owner;
   private MessageContainer container = null;
   /* Zmienne poÅÄ czeniowe */
   private String destination = null;
   private final static String C_FACTORY = "/ConnectionFactory";
   private Context ic;
   private TopicConnectionFactory tcf = null;
   private TopicConnection connection;Â
   private Topic topic;
   private TopicSession subSession;
   private TopicSubscriber subscriber;
   private TopicSession pubSession;
   private TopicPublisher publisher;
   /* -------------------- */
   public ChatClientBean(){}
   @Override
   public void init(String topicName, String owner, MessageContainer container){
       try{
           this.destination = topicName;
           this.owner = owner;
           this.container = container;
           ic = new InitialContext();
           tcf = (TopicConnectionFactory) ic.lookup(C_FACTORY);
           connection = tcf.createTopicConnection();
           pubSession = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
           subSession = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
           topic = (Topic) ic.lookup(destination);
           subscriber = subSession.createSubscriber(topic);
           publisher = pubSession.createPublisher(topic);
           subscriber.setMessageListener(this);
           System.out.println("Zaincjalizowano ChatClientBean dla "+owner);
       }catch(JMSException ex){
           System.out.println("Blad przy incjalizacji MessageProccesora");
           ex.printStackTrace();
       }catch(NamingException ex){
           System.out.println("Blad JNDI");
       }
   }
   @Override
   public void onMessage(Message message) {
       try{
               TextMessage tm = (TextMessage) message;
               if(container!= null){
                   container.service(tm.getText());
               }
               System.out.println("Odebrano przez : "+owner+ " : " + tm.getText());
           }catch(JMSException ex){
               System.out.println("Blad JMS przy odbieraniu");
               ex.printStackTrace();
           }
   }
   @Override
   public void sendMessage(String message){
       try{
           TextMessage tm = pubSession.createTextMessage(message);
           publisher.publish(tm);
           System.out.println("Wiadomosc wyslana przez "+owner+" : "+ tm.getText());
       }catch(JMSException ex){
           ex.printStackTrace();
       }
   }
   @Override
   public void start(){
       try{
           connection.start();
       }catch(JMSException ex){
           System.out.println("Blad przy startowaniu polaczenia");
       }
   }
   @Override
   public void close(){
       try{
           if(pubSession != null){
               pubSession.close();
           }
           if(subSession != null){
               subSession.close();
           }
           if(connection != null){
               connection.close();
           }
           if(ic != null){
               ic.close();
           }
       }catch(JMSException ex){
           System.out.println("Blad przy zamykaniu polaczenia : "+ owner);
           ex.printStackTrace();
       }catch(NamingException ex){
           System.out.println("Blad JNDI przy zamykaniu polaczenia "+owner);
       }
   }
   /* GETTERY i SETTERY */
   public String getOwner() {
       return owner;
   }
   public void setOwner(String owner) {
       this.owner = owner;
   }
   public MessageContainer getContainer() {
       return container;
   }
   public void setContainer(MessageContainer container) {
       this.container = container;
   }
   public String getDestination() {
       return destination;
   }
   public void setDestination(String destination) {
       this.destination = destination;
   }
   /* ----------------- */
Operator side
@Stateful
@LocalBean
public class ChatOperatorBean implements ChatOperatorLocal{
   private String owner;
   private ClientsContainer container;
    /* Zmienne poÅÄ czeniowe */
   private String destination = null;
   private final static String C_FACTORY = "/ConnectionFactory";
   private Context ic;
   private TopicConnectionFactory tcf = null;
   private TopicConnection connection;Â
   private Topic topic;
   private TopicSession subSession;
   private TopicSubscriber subscriber;
   private TopicSession pubSession;
   private TopicPublisher publisher;
   /* -------------------- */
   @Override
   public void init(String topicName, String owner, ClientsContainer container){
       try{
           this.destination = topicName;
           this.owner = owner;
           this.container = container;
           ic = new InitialContext();
           tcf = (TopicConnectionFactory) ic.lookup(C_FACTORY);
           connection = tcf.createTopicConnection();
           pubSession = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
           subSession = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
           topic = (Topic) ic.lookup(destination);
           subscriber = subSession.createSubscriber(topic);
           publisher = pubSession.createPublisher(topic);
           subscriber.setMessageListener(this);
           System.out.println("Zaincjalizowano ChatOperatorBean dla "+owner);
       }catch(JMSException ex){
           System.out.println("Blad przy incjalizacji MessageProccesora : "+owner);
           ex.printStackTrace();
       }catch(NamingException ex){
           System.out.println("Blad JNDI : "+owner);
           ex.printStackTrace();
       }
   }
   @Override
   public void onMessage(Message message) {
       try{
           TextMessage tm = (TextMessage) message;
           if(container!= null){
               container.service(tm.getText());
           }
           System.out.println("Odebrano przez : "+owner+" : "+ tm.getText());
       }catch(JMSException ex){
           System.out.println("Blad JMS przy odbieraniu u : "+owner);
           ex.printStackTrace();
       }
   }
   @Override
   public void sendMessage(String message){
       try{
           TextMessage tm = pubSession.createTextMessage(message);
           publisher.publish(tm);
           System.out.println("Wiadomosc wyslana przez "+owner+" : "+ tm.getText());
       }catch(JMSException ex){
           ex.printStackTrace();
       }
   }
   public void start(){
       try{
           connection.start();
       }catch(JMSException ex){
           System.out.println("Blad przy startowaniu polaczenia : "+owner);
       }
   }
   @Override
   public void close(){
       try{
           if(pubSession != null){
               pubSession.close();
           }
           if(subSession != null){
               subSession.close();
           }
           if(connection != null){
               connection.close();
           }
           if(ic != null){
               ic.close();
           }
       }catch(JMSException ex){
           System.out.println("Blad przy zamykaniu polaczenia : "+ owner);
           ex.printStackTrace();
       }catch(NamingException ex){
           System.out.println("Blad JNDI przy zamykaniu polaczenia "+owner);
       }
   }
   /* GETTERY i SETTERY */
   public String getOwner() {
       return owner;
   }
   public void setOwner(String owner) {
       this.owner = owner;
   }
   public ClientsContainer getContainer() {
       return container;
   }
   public void setContainer(ClientsContainer container) {
       this.container = container;
   }
   public String getDestination() {
       return destination;
   }
   public void setDestination(String destination) {
       this.destination = destination;
   }
   /* ----------------- */
client.xhtml
<h:body style="background-color: #99ff66">
       <h:outputStylesheet name="css/default.css" />
       <h:form id="form" >
           <p:outputPanel id="panel" >
               <h:panelGrid columns="2" cellpadding="5" id="startPanel" rendered="#{client.startPanelVisible}" >
                               <h:outputLabel value="Nazwa" for="nick" style="font-weight: bold;" />
                               <p:inputText value="#{client.nick}" id="nick" />
                               <p:commandButton value="Rozpocznij" actionListener="#{client.startChat()}" process="@this,nick" update="panel" id="start"/>
               </h:panelGrid>
               <p:panel header="WiadomoÅci" id="chatboxPanel" rendered="#{client.chatPanelVisible}">
                   <h:panelGroup id="chatbox">
                       <ui:repeat value="#{client.container.messages}" var="item">
                           #{item}
                           <br/>
                           <p:separator/>
                       </ui:repeat>
                       <p:poll interval="1" update="chatbox" />
                   </h:panelGroup>
               </p:panel>
               <p:outputPanel id="chatPanel" rendered="#{client.chatPanelVisible}">
                   <p:inputText value="#{client.message}"
                                styleClass="messageInput"
                                style="margin-top: 5px;width: 310px;"
                                />
                   <p:commandButton value="Send"
                                    actionListener="#{client.send()}"
                                    oncomplete="$('.messageInput').val('').focus()"
                                    />
                   <p:commandButton actionListener="#{client.closeChat()}" process="@this" update="panel"
                                    value="Close"
                                    />
               </p:outputPanel>
           </p:outputPanel>
       </h:form>
   </h:body>
operator.xhtml
<h:body>
       <h:outputStylesheet name="css/defaultOperator.css" />
       Zalogowany jako : #{logOn.operator.firstName} #{logOn.operator.lastName}
       <p:separator />
       <h:form id="form" prependId="false">
               <p:selectOneButton value="#{operator.viewController.selectedPanel}" style="margin-bottom: 10px;" >
                   <f:selectItem itemValue="0" itemLabel="Pierwszy" />
                   <f:selectItem itemValue="1" itemLabel="Kod na stronÄ" />
                   <f:selectItem itemValue="2" itemLabel="Czaty" />
                   <p:ajax event="change" update="form" />
               </p:selectOneButton>
               <p:outputPanel id="panel0" rendered="#{operator.viewController.getVisible(0)}">
               </p:outputPanel>
               <p:outputPanel id="panel1" rendered="#{operator.viewController.getVisible(1)}">
                   <p:fieldset styleClass="fieldset">
                       <h:panelGrid columns="1" >
                           <h:outputText value="Wklej ten kod w sekcji head strony" />
                           <h:inputTextarea id="trackingCode" readonly="true" rows="10" cols="40" value="#{operator.tr}"/>
                       </h:panelGrid>
                   </p:fieldset>
               </p:outputPanel>
               <p:outputPanel id="panel2" rendered="#{operator.viewController.getVisible(2)}" autoUpdate="true">
                   <p:outputPanel styleClass="left">
                       <p:panel header="Status" styleClass="statusBox">
                           <p:commandButton actionListener="#{operator.startChat()}" value="PoÅÄ cz" />
                           <p:commandButton actionListener="#{operator.closeChat()}" value="RozÅÄ cz" />
                       </p:panel>
                       <p:panel header="OczekujÄ cy klienci" styleClass="clientBox">
                           <p:outputPanel id="clientPanel" >
                               <ui:repeat value="#{operator.container.notServiced}" var="item" >
                                   <h:outputText value="#{item.clientName}" />
                                   <p:commandButton styleClass="startbtn" value=">>" actionListener="#{operator.startWithClient(item.clientName)}" />
                                   <p:separator />
                               </ui:repeat>
                           </p:outputPanel>
                       </p:panel>
                   </p:outputPanel>
                   <p:panel header="Aktywne chaty" id="activeChats" styleClass="chatTabs">
                       <p:tabView id="tabView" value="#{operator.container.serviced}" var="item">
                           <p:tab id="clientTab" title="#{item.clientName}" >
                              <p:outputPanel >
                                   <p:panel header="WiadomoÅci" id="chatboxPanel" styleClass="messageBox">
                                       <p:outputPanel id="chatbox" >
                                            <ui:repeat value="#{item.messages}" var="msg">
                                                <b>#{msg.from} : </b>#{msg.text}
                                                <p:separator />
                                            </ui:repeat>
                                       </p:outputPanel>
                                    </p:panel>
                                  <p:poll interval="1" update="chatbox" />
                               </p:outputPanel>
                               <p:outputPanel id="chatPanel" >
                                   <p:inputText value="#{item.currentMessage}"
                                            styleClass="messageInput"
                                            style="margin-top: 5px;width: 310px;"
                                            />
                                   <p:commandButton value="Send"
                                                actionListener="#{operator.send(item.clientName,item.currentMessage)}"
                                                oncomplete="$('.messageInput').val('').focus()"
                                                styleClass="button"
                                                />
                               </p:outputPanel>
                           </p:tab>
                       </p:tabView>
                   </p:panel>
               </p:outputPanel>
           </h:form>
   </h:body>
--------------------------------------------------------------
Reply to this message by going to Community
[https://community.jboss.org/message/796973#796973]
Start a new discussion in EJB3 at Community
[https://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2029]