Spring整合jms消息
整个项目目录结构如下:
JmsSpringContext.java
package com.wulj.jms.internal.activisor; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext; import com.wulj.jms.message.Message;
import com.wulj.jms.util.AmqUtils; /**
* @author:wulj
* @功能描述: 启动JMS
* @created:2019-8-12
*/
public class JmsSpringContext { private static final Logger log = LoggerFactory.getLogger(JmsSpringContext.class); private static ApplicationContext context; private static Object lock = new Object(); public synchronized void startup() {
log.info("start instance JmsSpringContext !! ");
initContext();
log.info("startup JmsSpringContext success!! ");
} public static ApplicationContext getApplicationContext() {
initContext();
return context;
} private static void initContext() {
synchronized (lock) {
if (context == null) {
context = new GenericXmlApplicationContext("classpath*:applicationContex.xml");
JmsSpringContext jmsSpringContext = new JmsSpringContext();
jmsSpringContext.sendTestTopic();
}
}
} /**
* @author:wulj
* @date:2019-8-12
* @Description:发送测试jms数据,检验是否正常
* @return void: 返回值类型
* @throws
*/
private void sendTestTopic() {
LoggerFactory.getLogger(this.getClass()).info("JMS模块已启动");
Message m = new Message();
m.setMessageType("testSendMessage");
try {
AmqUtils.sendTopic("test.test1", m);
}
catch (Exception e) {
e.printStackTrace();
}
} }
JmsExceptionListener.java
package com.wulj.jms.internal.listener; import javax.jms.ExceptionListener;
import javax.jms.JMSException; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; /**
*
* @author wulj
*/
@Component
public class JmsExceptionListener implements ExceptionListener{ private static final Logger logger = LoggerFactory.getLogger(JmsExceptionListener.class); public void onException(JMSException exception) {
logger.error("监听Direcotor的JMS出错:{}" + exception.getMessage(),exception); } // @Override
// public void onException(JMSException exception) {
// logger.error("监听Direcotor的JMS出错:{}" + exception.getMessage(),exception);
// } }
MessageSender.java
package com.wulj.jms.internal.sender; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component; /**
* 消息发送器
*
* @author wulj
*/
@Component
public class MessageSender { private static final Logger logger = LoggerFactory.getLogger(MessageSender.class); private final JmsTemplate jmsTemplate; @Autowired
public MessageSender(final JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
} public void sendTopic(final String topic, final Object message) {
jmsTemplate.setPubSubDomain(true);
try{
jmsTemplate.convertAndSend(topic, message);
}catch (org.springframework.jms.UncategorizedJmsException e){
logger.error("JMS消息服务器连接失败:{"+e.getMessage()+"}");
}
} public void sendQueue(final String queue, final Object message) {
jmsTemplate.setPubSubDomain(false);
jmsTemplate.convertAndSend(queue, message);
} }
JmsPropertyPlaceholderConfigurer.java
package com.wulj.jms.internal.spring; import java.io.File; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource; /**
*
* @author 张炎民
*
*/
public class JmsPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer { private static final String JMS_FILE_PROPERTIES = "jms.properties"; @Override
public void setLocation(Resource location) {
try {
FileSystemResource resource = new FileSystemResource(getHome() + JMS_FILE_PROPERTIES);
super.setLocation(resource);
} catch (Exception e) {
e.printStackTrace();
}
} private static String getHome() {
String path = "jms";
String osType = System.getProperty("os.name");
String userHome = System.getProperty("user.home");
String fileSeparator = System.getProperty("file.separator");
String homePath;
if (osType.toLowerCase().contains("windows")) {
homePath = userHome + (userHome.endsWith(fileSeparator) ? "" : fileSeparator) + "." + path + fileSeparator;
}
else {
homePath = fileSeparator + "opt" + fileSeparator + path + fileSeparator + "config" + fileSeparator;
} File file = new File(homePath);
if (!file.exists()) {
file.mkdir();
}
return homePath;
}
}
Message.java
package com.wulj.jms.message; import java.io.Serializable; /**
* @author wulj
*/
public class Message implements Serializable {
private static final long serialVersionUID = 4009232658158976386L; private String messageType;
private String messageName;
private String messageDesc;
public String getMessageType() {
return messageType;
}
public void setMessageType(String messageType) {
this.messageType = messageType;
}
public String getMessageName() {
return messageName;
}
public void setMessageName(String messageName) {
this.messageName = messageName;
}
public String getMessageDesc() {
return messageDesc;
}
public void setMessageDesc(String messageDesc) {
this.messageDesc = messageDesc;
} }
AmqUtils.java
package com.wulj.jms.util; import java.io.IOException;
import java.lang.reflect.Field; import javax.jms.JMSException; import org.apache.activemq.command.ActiveMQTextMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.wulj.jms.internal.activisor.JmsSpringContext;
import com.wulj.jms.internal.sender.MessageSender;
import com.wulj.jms.message.Message; /**
* ActiveMQ工具类,用于获取消息发送器等
*
* @author wulj 2019-8-12
*/
public class AmqUtils {
// public static String taskBody;
private static final Logger logger = LoggerFactory.getLogger(AmqUtils.class); /**
* 获取消息发送器
*
* @return
*/
private static MessageSender getSender() {
return JmsSpringContext.getApplicationContext().getBean(MessageSender.class);
} public static void sendTopic(String topic, Message message) {
try {
MessageSender sender = getSender();
if (sender != null) {
ActiveMQTextMessage textMsg = createMsg(message);
if (textMsg != null) {
sender.sendTopic(topic, textMsg);
}
}
else {
logger.warn("发送Topic失败:" + message.toString());
}
}
catch (Exception e) {
e.printStackTrace();
try {
logger.warn("发送Topic失败:" + message.toString(), e);
}
catch (Exception e1) {
e1.printStackTrace();
}
}
} public static void sendTopic(String ip,String topic, Message message) {
try {
MessageSender sender = getSender();
if (sender != null) {
ActiveMQTextMessage textMsg = createMsg(message);
if (textMsg != null) {
sender.sendTopic(topic, textMsg);
}
}
else {
logger.warn("发送Topic失败:" + message.toString());
}
}
catch (Exception e) {
e.printStackTrace();
try {
logger.warn("发送Topic失败:" + message.toString(), e);
}
catch (Exception e1) {
e1.printStackTrace();
}
}
} public static void sendQueue(String queue, Message wceMessage) {
MessageSender sender = getSender(); if (sender != null) {
ActiveMQTextMessage textMsg = createMsg(wceMessage);
if (textMsg != null) {
sender.sendQueue(queue, textMsg);
}
}
} private static ActiveMQTextMessage createMsg(Message message) {
try {
ActiveMQTextMessage text = new ActiveMQTextMessage();
Field[] fields = message.getClass().getFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
if("serialVersionUID".equals(field.getName()) || field.get(message)==null) {
continue;
}
field.setAccessible(true);
text.setProperty(field.getName(), field.get(message)); }
return text;
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return null;
} public static void sendTest() {
MessageSender sender = getSender(); if (sender != null) {
try {
ActiveMQTextMessage text = new ActiveMQTextMessage();
text.setStringProperty("ComponentType", "Workload");
text.setStringProperty("ComponentValue", "stoppedWorkload");
text.setStringProperty("EventText", "你好世界!");
text.setLongProperty("Progress", 100);
text.setStringProperty("ResourceId", "2012");
text.setStringProperty("ResourceName", "虚机");
String topic = "wulj_test_test";
sender.sendTopic(topic, text);
}
catch (JMSException e) {
e.printStackTrace();
}
}
}
}
StringUtil.java
package com.wulj.jms.util; import java.io.UnsupportedEncodingException;
import java.sql.Blob;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; public class StringUtil {
/**
* @param str
* @return
*/
public static String replaceNull(String str) {
if (str == null || str.equals("") || str.equals("null")) {
str = "";
}
return str;
} /**
* 将Blob类型的值转为字符串
*
* @param cont
* @return
*/
public static String readBlobAsString(Blob cont) {
if (cont == null) {
return null;
} try {
return new String(cont.getBytes(1L, (int)cont.length()));
}
catch (SQLException e) {
return null;
}
} /**
* @author:wangyy
* @date:2015-7-10
* @Description:遍历传进来的数,并以传入的分割符进行分割
* @return void: 返回值类型
* @throws
*/
public static String traversalNum(Integer num, String splitStr) {
if (num == null) {
return null;
} if (StringUtils.isEmpty(splitStr)) {
splitStr = ",";
}
StringBuffer str = new StringBuffer();
for (int i = 0; i < num; i++) {
str.append(i);
if (i != num - 1) {
str.append(splitStr);
}
}
return str.toString();
} /**
* 根据字节长度截取字串
*
* @param input
* @param n
* @return
*/
public static String substrb(String input, int n) {
if (n <= 0) {
return "";
} byte[] bytes = input.getBytes();
if (n >= bytes.length) {
return input;
} byte[] data = new byte[n]; // 结果 int x = 0;
int y = 0;
while (x < n) {
int length = Character.toString(input.charAt(y)).getBytes().length;
if (length > 1) { // 双字节
if (x >= n - 1) { // 如果是最后一个字节
break;
} data[x] = bytes[x];
data[x + 1] = bytes[x + 1];
x += 2;
y++;
}
else {
data[x] = bytes[x];
x++;
y++;
}
}
return new String(data, 0, x);
} /**
* 得到字符串的半角长度
*
* @param strInput
* 待检测的字符串
* @return 字符串的长度
*/ public static int length(String strInput) {
if (!isNull(strInput)) {
int i = 0;
Pattern p = Pattern.compile("[\u4E00-\u9FA5]");
Matcher m = p.matcher(strInput);
while (m.find())
i++;
return strInput.length() + i / 2;
}
return 0;
} /**
* 得到字符串是否为空
*
* @param strInput
* 待检测的字符串
* @return 若为空返回 true
*/
@Deprecated
public static boolean isNull(String strInput, String... strings) {
if (strInput != null && !strInput.trim().equals("")) {
return false;
}
for (String s : strings) {
if (!isNull(s)) {
return false;
}
}
return true;
} /**
* 得到长度为ilength的格式化字符串
*
* @param strInput
* 待检测的字符串
* @param ilength
* 目标长度
* @param isLeft
* 为true时从左侧加入空格,否则从右加入
* @return 格式化后的字符串
*/ public static String formatToLength(String strInput, int ilength, boolean isLeft) {
if (!isNull(strInput)) {
if (length(strInput) < ilength) {
if (isLeft) {
String temp = " ";
for (int i = length(strInput); i < ilength; i++) {
temp = temp.concat(" ");
}
strInput = temp.concat(strInput);
}
else {
for (int i = length(strInput); i < ilength; i++) {
strInput = strInput.concat(" ");
}
}
}
return strInput;
} StringBuffer sb = new StringBuffer();
for (int i = 0; i < ilength; i++)
sb.append(" ");
return sb.toString();
} /**
* 将List<HashMap>中的值,转换为以分隔符分割的字符串
*
* @param list
* 待转换的List
* @param split
* 分割符
* @param preFix
* 添加的前缀
* @param afterFix
* 添加的后缀
* @return 转换后的字符串
*/
public static String conditionConvert(List list, String split, String preFix, String afterFix) {
StringBuilder builder = new StringBuilder();
int lsLen = list.size();
for (int index = 0; index < lsLen; index++) {
if (index > 0) {
builder.append(split);
}
builder.append(preFix);
builder.append(list.get(index).toString());
builder.append(afterFix);
} return builder.toString();
} /**
* 将List中的值,转换为以逗号分隔的字符串,每个值,以"'"分割
*
* @param list
* 待转换的List<HashMap>
* @return 转换后的字符串
*/
@Deprecated
public static String ConditionConvertStr(List list) {
return conditionConvert(list, ",", "'", "'");
} public static String convertWithCode(String str, String orgiCode, String newCode) {
try {
if (isNull(str) || isNull(newCode)) {
return str;
} byte[] bytes = str.getBytes(isNull(orgiCode) ? "ISO8859-1" : orgiCode); return new String(bytes, newCode);
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
return str;
} } /**
* 把String中的特殊字符串(",",<,>,&)转换为转义字符
*
* @param str
* 待转换的String
* @return 转换后的字符串
*/
public static String convertSpecChar(String str) {
if (str == null || str.equals("")) {
return str;
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
switch (c) {
case '&':
sb.append("&");
break;
case '<':
sb.append("<");
break;
case '>':
sb.append(">");
break;
case '\'':
sb.append("'");
break;
case '"':
sb.append(""");
break;
default:
sb.append(c);
break;
}
}
return sb.toString();
} /**
* 获取非""值的字符串
applicationContex.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:amq="http://activemq.apache.org/schema/core" xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core-5.2.0.xsd
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms-3.0.xsd"
default-lazy-init="true">
<!-- 扫描指定包下面的所有类 -->
<context:component-scan base-package="com.wulj.jms" /> <!-- 配置文件加载器 -->
<!-- <bean id="propertyConfigurer" class="com.wulj.jms.internal.spring.JmsPropertyPlaceholderConfigurer">
<property name="location" value="jms.properties"/>
</bean> --> <amq:connectionFactory id="amqConnectionFactory" brokerURL="tcp://192.168.215.207:61616?wireFormat.maxInactivityDurationInitalDelay=30000" /> <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<constructor-arg ref="amqConnectionFactory" />
<property name="exceptionListener" ref="jmsExceptionListener" />
<property name="sessionCacheSize" value="10" />
</bean> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<constructor-arg ref="connectionFactory" />
</bean> </beans>
jms.properties
activemq.ip=192.168.215.207
测试类:
package com.wulj.jms.test; import com.wulj.jms.message.Message;
import com.wulj.jms.util.AmqUtils; public class TestSendMessage { public static void sendMessage() {
Message message = new Message();
message.setMessageDesc("hahahahahahaahaha");
AmqUtils.sendTopic("wulj_test_send_topic", message);
} public static void main(String[] args) {
sendMessage();
}
}
登陆http://192.168.215.207:8161/admin,可以看到Name为wulj_test_send_topic的Topics
Spring整合jms消息的更多相关文章
- Spring整合JMS(二)——三种消息监听器
原文地址:http://haohaoxuexi.iteye.com/blog/1893676 1.3 消息监听器MessageListener 在Spring整合JMS的应用中我们在定义消息监 ...
- Spring整合JMS(二)——三种消息监听器(转)
*注:别人那复制来的 1.3 消息监听器MessageListener 在Spring整合JMS的应用中我们在定义消息监听器的时候一共可以定义三种类型的消息监听器,分别是MessageList ...
- Spring整合JMS(一)——基于ActiveMQ实现
1.1 JMS简介 JMS的全称是Java Message Service,即Java消息服务.它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息.把它应用到 ...
- Spring整合JMS(四)——事务管理
原文链接:http://haohaoxuexi.iteye.com/blog/1983532 Spring提供了一个JmsTransactionManager用于对JMS ConnectionFact ...
- Spring整合JMS——事务管理
Spring提供了一个JmsTransactionManager用于对JMS ConnectionFactory做事务管理.这将允许JMS应用利用Spring的事务管理特性.JmsTransactio ...
- Spring整合JMS(四)——事务管理(转)
*注:别人那复制来的 Spring提供了一个JmsTransactionManager用于对JMS ConnectionFactory做事务管理.这将允许JMS应用利用Spring的事务管理特性.Jm ...
- Spring整合JMS(一)——基于ActiveMQ实现 (转)
*注:别人那复制来的 1.1 JMS简介 JMS的全称是Java Message Service,即Java消 息服务.它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者 ...
- ActiveMQ (三) Spring整合JMS入门
Spring整合JMS入门 前提:安装好了ActiveMQ ActiveMQ安装 Demo结构: 生产者项目springjms_producer: pom.xml <?xml versio ...
- 消息中间件ActiveMQ及Spring整合JMS
一 .消息中间件的基本介绍 1.1 消息中间件 1.1.1 什么是消息中间件 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排 ...
随机推荐
- ueditor+实现word图片自动上传
最近公司做项目需要实现一个功能,在网页富文本编辑器中实现粘贴Word图文的功能. 我们在网站中使用的Web编辑器比较多,都是根据用户需求来选择的.目前还没有固定哪一个编辑器 有时候用的是UEditor ...
- nopCommerce4.10学习笔记——入门
1.下载 千万不要去GitHub上下载,千万不要去GitHub上下载,千万不要去GitHub上下载!!!,重要的事情说3遍,说多了都是泪,你懂的 下载网址:https://www.nopcommerc ...
- python下selenium模拟浏览器基础操作
1.安装及下载 selenium安装: pip install selenium 即可自动安装selenium geckodriver下载:https://github.com/mozilla/ge ...
- .py与.pyc文件区别
原来Python的程序中,是把原始程序代码放在.py文件里,而Python会在执行.py文件的时候.将.py形式的程序编译成中间式文件(byte-compiled)的.pyc文件,这么做的目的就是为了 ...
- 【转】Java压缩和解压文件工具类ZipUtil
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- The control collection cannot be modified during DataBind, Init, Load, PreRender or Unload phases.
https://stackoverflow.com/questions/5508666/dynamically-add-html-to-asp-net-page https://stackoverfl ...
- 全面解读php-函数
一.静态变量 二.函数的参数 三.函数的引用返回 四.外部文件的导入 五.内置函数 1.时间日期函数 2.IP处理函数 3.打印函数: 分类 函数名 说明 语言结构 print() 只能打印一个变量 ...
- python3使用ltp语言云
text="我爱自然语言处理." text=str(text) #text=urllib.quote(text) text=urllib.parse.quote(text) def ...
- 关于eclipse安装插件的问题
使用eclipse(luna)不行,其为安装了ee有关插件的 使用eclipse(Juno)可以,其为原生版本
- Checkbox 多选框
Checkbox 多选框 一组备选项中进行多选 ¶基础用法 单独使用可以表示两种状态之间的切换,写在标签中的内容为 checkbox 按钮后的介绍. 在el-checkbox元素中定义v-model绑 ...