Ł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&...]