jfinal集成activeMQ后,在消息接收时操作数据库,数据源为null

如题代码如下:

public class MsgConsumer implements MessageListener {
	
	private static final Logger LOGGER = LoggerFactory.getLogger(MsgConsumer.class);
    private static final String BROKER_URL = ActiveMQConnection.DEFAULT_BROKER_URL;
    private static final String SUBJECT = "test-activemq-queue";

    public static void main(String[] args) throws JMSException {
        //初始化ConnectionFactory
    	ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(BROKER_URL);

        //创建mq连接
        Connection conn = connectionFactory.createConnection();
        //启动连接
        conn.start();

        //创建会话
        Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);

        //通过会话创建目标
        Destination dest = session.createQueue(SUBJECT);
        //创建mq消息的消费者
        MessageConsumer consumer = session.createConsumer(dest);

        //初始化MessageListener
        MsgConsumer me = new MsgConsumer();

        //给消费者设定监听对象
        consumer.setMessageListener(me);
    }

    @Override
    public void onMessage(Message message) {
        TextMessage txtMessage = (TextMessage)message;
        try {
            LOGGER.info ("get message: " + txtMessage.getText());
            String oldId = txtMessage.getText();
    		//这里查询就报错了.....
    		MostViewed model = new MostViewed().findFirst("select * from most_viewed where old_id= ?", oldId);
    		model.setPlayImgSrc("***");
    		model.setPlayUrl("***");
    		boolean result = model.update();
    		LOGGER.info("MQ执行修改数据ID={}结果为:{}",oldId,result);
        } catch (JMSException e) {
            LOGGER.error("error {}", e);
        }
    }
    

}

今天在学习测试一个爬虫列子,用到了activeMQ和jfinal,一切工作准备就绪后,往第三方网站开始爬数据然后得到一个list,然后循环正常入库并循环创建一个消息队列在MQ中,这时候当MQ的消费者端接收消息时(MQ中的消费者端我实现了MessageListener接口,并重写了onMessage方法),根据接收到的消息进行爬数据采集更新数据库;这时候就出现错误了,错误日志如下:

java.lang.NullPointerException
	at com.jfinal.plugin.activerecord.Model.find(Model.java:588)
	at com.jfinal.plugin.activerecord.Model.findFirst(Model.java:606)
	at com.softisland.common.activemq.MsgConsumer.getDetail(MsgConsumer.java:75)
	at com.softisland.common.activemq.MsgConsumer.onMessage(MsgConsumer.java:58)
	at org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1404)
	at org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
	at org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
	at org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
	at org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)

是不是程序访问数据库不经过jfinal的路由器就得不到数据源啊?因为MQ监听到消息后执行数据库就报空指针了;求波总&&高手们给个解决思路@jFinal

评论区

JFinal

2018-03-21 23:45

ActiveRecordPlugin 对象的创建与初始化代码在哪里? 没有初始化怎么可以使用呢?

阿帕奇

2018-03-22 09:02

@JFinal 在BaseConfig里面配置好了的,正常的从浏览器请求过去经过路由然后到controller操作数据库是可以正常使用增删改查的;但是MQ接受到消息进行数据库操作就报数据操作config为null;
一下是我的配置文件代码:
/**
* 本 demo 仅表达最为粗浅的 jfinal 用法,更为有价值的实用的企业级用法 详见 JFinal 俱乐部:
* http://jfinal.com/club
*
* API引导式配置
*/
public class BaseConfig extends JFinalConfig {

/**
* 配置常量
*/
public void configConstant(Constants me) {
// 加载少量必要配置,随后可用PropKit.get(...)获取值
PropKit.use("config.txt");
}

/**
* 配置路由
*/
public void configRoute(Routes me) {
// me.setBaseViewPath("/views");
me.add("/", IndexController.class);
}

public void configEngine(Engine me) {// 定义通用的模板
}

public static DruidPlugin createDruidPlugin() {
DruidPlugin dp = new DruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim());
WallFilter wall = new WallFilter();
wall.setDbType("mysql");
dp.addFilter(wall);
return dp;
}

/**
* 配置插件
*/
public void configPlugin(Plugins me) {
// 配置C3p0数据库连接池插件
DruidPlugin druidPlugin = createDruidPlugin();
me.add(druidPlugin);
// 配置ActiveRecord插件
ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
// 所有映射在 MappingKit 中自动化搞定
_MappingKit.mapping(arp);
arp.setShowSql(true);// 控制台显示sql
me.add(arp);

}

/**
* 配置全局拦截器
*/
public void configInterceptor(Interceptors me) {
me.add(new SessionInViewInterceptor());
// 事务控制器
me.add(new TxByActionKeyRegex("(.*save.*|.*update.*|.*del.*|.*add.*)", true));
me.add(new TxByMethodRegex("(.*save.*|.*update.*)"));
me.add(new TxByMethods("save", "update"));
me.add(new TxByActionKeys("/tx/save", "/tx/update"));
}

/**
* 配置处理器
*/
public void configHandler(Handlers me) {
me.add(new ContextPathHandler("contextPath"));
}
}

JFinal

2018-03-22 17:59

我看到你有一个 public static void main(String[] args) 方法, 难道是启动该 main 方法时使用的 ActiveRecordPlugin

确保 ActiveRecordPlugin 无论在 web 环境下,还是在你的 main 方式启动下都要被初始化

热门反馈

扫码入社