Runnable 中的@Resource设值为null

部署运行你感兴趣的模型镜像
1.在spring中启动线程
		Thread thread = new Thread(new AutoRun ());
		thread.start();

 2.线程类中用到了spring进行DI注入 sqlService

public class AutoRun implements Runnable {
	
	@Resource
	private SqlService sqlService;

	public void setSqlService(SqlService sqlService) {
		this.sqlService = sqlService;
	}

	public void run() {
		while (true) {
			try {
				
				String a = new Date().toLocaleString();			
				sqlService.read("select '"+a+"' from dual");
				
				System.out.println(a);

				Thread.sleep(100);// 休眠2分钟

			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}

		}
	}
}

 3.会报空指针错误,

4.只能通过该类的构造函数从调用类中传过来,或者

//得到容器
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//使用容器调用bean
RagBady bady=(RagBady)context.getBean("rag");

 5.参考资料http://bbs.youkuaiyun.com/topics/330139385

您可能感兴趣的与本文相关的镜像

Facefusion

Facefusion

AI应用

FaceFusion是全新一代AI换脸工具,无需安装,一键运行,可以完成去遮挡,高清化,卡通脸一键替换,并且Nvidia/AMD等显卡全平台支持

在该代码块中计了心跳机制,但没有计超时没有收到回信就断开连接的计,该怎么修改? @Slf4j @Component("clientManageTask") public class ProxyClientManageTask implements Runnable { @Resource private CloudDeviceService cloudDeviceService; @Resource private ProxyHttpClient proxyHttpClient; @Resource private ProxyClientService proxyClientService; @Resource private DeviceTokenService deviceTokenService; /** * ScheduledExecutorService 任务线程池,用于处理周期性任务 */ private static final ScheduledExecutorService scheduledThreadPool = new ScheduledThreadPoolExecutor(10, new ThreadFactoryBuilder().setNameFormat("proxy-scheduled-pool" + "-%s").build()); /** * 初始延迟(s) */ private static final int INITIAL_DELAY_S = 30; /** * 每 10s 检查一次 */ private static final int SCHEDULE_PERIOD = 10; /** * 重连连续失败的次数上限,达到后不再重连 */ private static final int RECONNECT_FAILED_CNT_MAX = 3; /** * 初始化检查任务 */ public void start() { scheduledThreadPool.scheduleWithFixedDelay(this, INITIAL_DELAY_S, SCHEDULE_PERIOD, TimeUnit.SECONDS); } @Override public void run() { try { proxyConnManageJob(); } catch (Exception e) { log.error(e.toString(), e); } } private void proxyConnManageJob() { log.debug("run proxyConnManageJob: check cloud access & check proxy connection status"); if (!cloudDeviceService.checkCloudAccessEnable()) { return; } DevReqType proxyRequestType = DevReqType.INVALID_REQUEST; String requestId = null; ProxyServer proxyServerClone; synchronized (ProxyConnectionHolder.PROXY_CONNECTION_LOCK) { proxyServerClone = ProxyConnectionHolder.cloneProxyServer(); if (StringUtils.isEmpty(proxyServerClone.getServerKey())) { log.debug("no need to manage this empty connection"); return; } switch (proxyServerClone.getConnectionStatus()) { case CONNECTING: // do nothing break; case CONNECTED: if (checkConnectedStatus(proxyServerClone)) { sendHartBeat(proxyServerClone); } return; case DISCONNECTED: if (checkDisconnectedStatus(proxyServerClone)) { // reconnect proxyServerClone.setConnectionStatus(ConnectionStatus.RECONNECTING); ProxyConnectionHolder.setProxyServer(proxyServerClone); requestId = RequestIdGenerator.generateReqId(); ProxyConnectionHolder.cacheProxyReqInfo(requestId, DevReqType.RECONNECT); proxyRequestType = DevReqType.RECONNECT; } break; case RECONNECTING: default: log.info("Invalid connection status of proxy: {}", proxyServerClone.getConnectionStatus()); return; } } if (Objects.equals(proxyRequestType, DevReqType.RECONNECT)) { reconnect2ProxyServer(requestId, proxyServerClone.getServerKey()); } } @Override public void sendHeartBeat(ChannelHandlerContext ctx, String deviceId, String requestId) { try { String strUri = String.format(ProxyUriEnum.HEART_BEAT_URI.getUri(), deviceId); URI uri = new URI(strUri); sendPostRequest(ctx, uri, null, requestId); } catch (Exception ex) { log.warn(ex.toString(), ex); } } 在netty-client的ResponseHandler中是这样计的: private void handleHeartBeatResponse() { synchronized (ProxyConnectionHolder.PROXY_CONNECTION_LOCK) { ProxyServer proxyServer = ProxyConnectionHolder.getProxyServer(); proxyServer.setLastRecvTime(TimeUtils.getCurrentTimeS()); ProxyConnectionHolder.setProxyServer(proxyServer); } }
09-26
为什么这个定时任务需要手动start: @Slf4j @Component("clientManageTask") public class ProxyClientManageTask implements Runnable { @Resource private CloudDeviceService cloudDeviceService; @Resource private ProxyHttpClient proxyHttpClient; @Resource private ProxyClientService proxyClientService; @Resource private DeviceTokenService deviceTokenService; /** * ScheduledExecutorService 任务线程池,用于处理周期性任务 */ private static final ScheduledExecutorService scheduledThreadPool = new ScheduledThreadPoolExecutor(10, new ThreadFactoryBuilder().setNameFormat("proxy-scheduled-pool" + "-%s").build()); /** * 初始延迟(s) */ private static final int INITIAL_DELAY_S = 30; /** * 每 10s 检查一次 */ private static final int SCHEDULE_PERIOD = 10; /** * 重连连续失败的次数上限,达到后不再重连 */ private static final int RECONNECT_FAILED_CNT_MAX = 3; /** * 心跳包超时阈,单位:秒 */ private static final int HEARTBEAT_TIMEOUT_S = 80; /** * 心跳机制重试次数 */ private static final int HEARTBEAT_MAX_RETRY_COUNT = 3; /** * 心跳机制重试间隔时间,单位:秒 */ private static final int HEARTBEAT_RETRY_INTERVAL_S = 10; /** * 初始化检查任务 */ public void start() { scheduledThreadPool.scheduleWithFixedDelay(this, INITIAL_DELAY_S, SCHEDULE_PERIOD, TimeUnit.SECONDS); } @Override public void run() { try { proxyConnManageJob(); } catch (Exception e) { log.error(e.toString(), e); } } private void proxyConnManageJob() { log.debug("run proxyConnManageJob: check cloud access & check proxy connection status"); if (!cloudDeviceService.checkCloudAccessEnable()) { return; } DevReqType proxyRequestType = DevReqType.INVALID_REQUEST; String requestId = null; ProxyServer proxyServerClone; synchronized (ProxyConnectionHolder.PROXY_CONNECTION_LOCK) { proxyServerClone = ProxyConnectionHolder.cloneProxyServer(); if (StringUtils.isEmpty(proxyServerClone.getServerKey())) { log.debug("no need to manage this empty connection"); return; } switch (proxyServerClone.getConnectionStatus()) { case CONNECTING: // do nothing break; case CONNECTED: if (checkConnectedStatus(proxyServerClone)) { handleHeartBeat(proxyServerClone); } return; case DISCONNECTED: if (checkDisconnectedStatus(proxyServerClone)) { // reconnect proxyServerClone.setConnectionStatus(ConnectionStatus.RECONNECTING); ProxyConnectionHolder.setProxyServer(proxyServerClone); requestId = RequestIdGenerator.generateReqId(); ProxyConnectionHolder.cacheProxyReqInfo(requestId, DevReqType.RECONNECT); proxyRequestType = DevReqType.RECONNECT; } break; case RECONNECTING: default: log.info("Invalid connection status of proxy: {}", proxyServerClone.getConnectionStatus()); return; } } if (Objects.equals(proxyRequestType, DevReqType.RECONNECT)) { reconnect2ProxyServer(requestId, proxyServerClone.getServerKey()); } } private boolean checkConnectedStatus(@Nonnull ProxyServer proxyServerClone) { // 根据上一次的接收数据时间,判断连接是否已经断开 if (TimeUtils.isTimeoutS(proxyServerClone.getLastRecvTime(), (int) proxyServerClone.getConnectedTimeout())) { log.info("connection read timeout"); proxyServerClone.setConnectionStatus(ConnectionStatus.DISCONNECTED); closeOldChannel(proxyServerClone); ProxyConnectionHolder.setProxyServer(proxyServerClone); return false; } if (TimeUtils.isTimeoutS(proxyServerClone.getUpdateTime(), proxyServerClone.getExpiresIn())) { // serverKey 超时,主动关闭连接 log.info("Going close this timeout connection"); closeOldChannel(proxyServerClone); proxyServerClone.setConnectionStatus(ConnectionStatus.DISCONNECTED); proxyServerClone.setExpiresIn(0); proxyServerClone.setServerKey(null); ProxyConnectionHolder.setProxyServer(proxyServerClone); return false; } return true; } 而这个定时任务不用: @Component("serverManageTask") public class ProxyServerManageTask { @Resource private NettyProxyServer nettyProxyServer; /** * 每30s执行一次 * 延迟60s */ @Scheduled(fixedDelay = 30 * 1000, initialDelay = 60 * 1000) public void proxyConnectionManageJob() { nettyProxyServer.removeTimeoutClients(); } }
最新发布
09-27
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值