diff --git a/libraries/log4j.properties b/libraries/log4j.properties
index 2173c5d96f..ed367509d1 100644
--- a/libraries/log4j.properties
+++ b/libraries/log4j.properties
@@ -1 +1,5 @@
log4j.rootLogger=INFO, stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
\ No newline at end of file
diff --git a/libraries/pom.xml b/libraries/pom.xml
index c7ef64bc59..301fa86c8d 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -675,6 +675,30 @@
${mockftpserver.version}
test
+
+
+ org.igniterealtime.smack
+ smack-tcp
+ ${smack.version}
+
+
+
+ org.igniterealtime.smack
+ smack-im
+ ${smack.version}
+
+
+
+ org.igniterealtime.smack
+ smack-extensions
+ ${smack.version}
+
+
+
+ org.igniterealtime.smack
+ smack-java7
+ ${smack.version}
+
@@ -896,6 +920,7 @@
1.1.0
2.7.1
3.6
+ 4.3.1
diff --git a/libraries/src/main/java/com/baeldung/smack/StanzaThread.java b/libraries/src/main/java/com/baeldung/smack/StanzaThread.java
new file mode 100644
index 0000000000..72db258164
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/smack/StanzaThread.java
@@ -0,0 +1,40 @@
+package com.baeldung.smack;
+
+import org.jivesoftware.smack.AbstractXMPPConnection;
+import org.jivesoftware.smack.chat2.Chat;
+import org.jivesoftware.smack.chat2.ChatManager;
+import org.jivesoftware.smack.tcp.XMPPTCPConnection;
+import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
+import org.jxmpp.jid.impl.JidCreate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class StanzaThread implements Runnable {
+
+ private Logger logger = LoggerFactory.getLogger(StanzaThread.class);
+
+ @Override
+ public void run() {
+ XMPPTCPConnectionConfiguration config = null;
+ try {
+ config = XMPPTCPConnectionConfiguration.builder()
+ .setUsernameAndPassword("baeldung2","baeldung2")
+ .setXmppDomain("jabb3r.org")
+ .setHost("jabb3r.org")
+ .build();
+
+ AbstractXMPPConnection connection = new XMPPTCPConnection(config);
+ connection.connect();
+ connection.login();
+
+ ChatManager chatManager = ChatManager.getInstanceFor(connection);
+
+ Chat chat = chatManager.chatWith(JidCreate.from("baeldung@jabb3r.org").asEntityBareJidOrThrow());
+
+ chat.send("Hello!");
+
+ } catch (Exception e) {
+ logger.error(e.getMessage(), e);
+ }
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/smack/SmackIntegrationTest.java b/libraries/src/test/java/com/baeldung/smack/SmackIntegrationTest.java
new file mode 100644
index 0000000000..1e5e36ce24
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/smack/SmackIntegrationTest.java
@@ -0,0 +1,85 @@
+package com.baeldung.smack;
+
+import org.jivesoftware.smack.AbstractXMPPConnection;
+import org.jivesoftware.smack.SmackException;
+import org.jivesoftware.smack.XMPPException;
+import org.jivesoftware.smack.chat2.ChatManager;
+import org.jivesoftware.smack.filter.StanzaTypeFilter;
+import org.jivesoftware.smack.packet.Message;
+import org.jivesoftware.smack.tcp.XMPPTCPConnection;
+import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.jxmpp.stringprep.XmppStringprepException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.concurrent.CountDownLatch;
+
+public class SmackIntegrationTest {
+
+ private static AbstractXMPPConnection connection;
+ private Logger logger = LoggerFactory.getLogger(SmackIntegrationTest.class);
+
+ @BeforeClass
+ public static void setup() throws IOException, InterruptedException, XMPPException, SmackException {
+
+ XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
+ .setUsernameAndPassword("baeldung","baeldung")
+ .setXmppDomain("jabb3r.org")
+ .setHost("jabb3r.org")
+ .build();
+
+ XMPPTCPConnectionConfiguration config2 = XMPPTCPConnectionConfiguration.builder()
+ .setUsernameAndPassword("baeldung2","baeldung2")
+ .setXmppDomain("jabb3r.org")
+ .setHost("jabb3r.org")
+ .build();
+
+ connection = new XMPPTCPConnection(config);
+ connection.connect();
+ connection.login();
+
+ }
+
+ @Test
+ public void whenSendMessageWithChat_thenReceiveMessage() throws XmppStringprepException, InterruptedException {
+
+ CountDownLatch latch = new CountDownLatch(1);
+ ChatManager chatManager = ChatManager.getInstanceFor(connection);
+ final String[] expected = {null};
+
+ new StanzaThread().run();
+
+ chatManager.addIncomingListener((entityBareJid, message, chat) -> {
+ logger.info("Message arrived: " + message.getBody());
+ expected[0] = message.getBody();
+ latch.countDown();
+ });
+
+ latch.await();
+ Assert.assertEquals("Hello!", expected[0]);
+ }
+
+ @Test
+ public void whenSendMessage_thenReceiveMessageWithFilter() throws XmppStringprepException, InterruptedException {
+
+ CountDownLatch latch = new CountDownLatch(1);
+ final String[] expected = {null};
+
+ new StanzaThread().run();
+
+ connection.addAsyncStanzaListener(stanza -> {
+ if (stanza instanceof Message) {
+ Message message = (Message) stanza;
+ expected[0] = message.getBody();
+ latch.countDown();
+ }
+ }, StanzaTypeFilter.MESSAGE);
+
+ latch.await();
+ Assert.assertEquals("Hello!", expected[0]);
+ }
+}